diff --git a/dataflow_neuro/primitives.act b/dataflow_neuro/primitives.act index 833a450..7ca5332 100644 --- a/dataflow_neuro/primitives.act +++ b/dataflow_neuro/primitives.act @@ -507,122 +507,8 @@ namespace tmpl { BUF_X1 reset_buf(.a=reset_B, .y=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); } - // A tree composed by arbiters. The first layer takes N signals - export template - defproc arbiter_tree(a1of1 in[N]; a1of1 out; power supply) - { + - bool tout; - - { N > 0 : "Invalid N, should be greater than 0" }; - - /* We calculate here how many arbiters we need to create for the full tree */ - pint inputs_in_layer, end, elements_in_layer; - pint odd_element_idx = 0; - pint odd_element_flag = 0; - inputs_in_layer = 0; - end = N-1; - pint element_counter = 0; - // Here we start a for loop to count the elements in the tree - // The loop iterates for every successive layer - // i is the variable used to iterate the inputs, - // j counts the elements in the layer - *[ inputs_in_layer != end -> - elements_in_layer = 0; // At every layer the counter of the elements is resetted - *[ inputs_in_layer < end -> - [ inputs_in_layer + 1 >= end -> - //In this case, the number of input is even: the layer finishes - inputs_in_layer = end; - odd_element_flag = 0; - [] inputs_in_layer + 2 >= end -> - //In this case, we arrived at the last input, this means the inputs are odd - //We need to save the odd input index and move it to the next layer, - //up to when the resulting number is even - odd_element_idx = end; - odd_element_flag = 1; - inputs_in_layer = end; - [] else -> - //If we are not close to the end, analyzes the next two inputs - inputs_in_layer = inputs_in_layer +2; - ] - elements_in_layer = elements_in_layer + 1; //At every step the elements count is updated - - ] - //Move the inputs_in_layer to the next layer - //Increase the end to account for the next layer elements - //If there was an odd element, count it also in the end - inputs_in_layer = end + 1; - end = end + elements_in_layer + odd_element_flag; - element_counter = element_counter + elements_in_layer; - ] - - { element_counter = 4 : "Michele you did wrong" }; - - // Creating the elements of the tree - arbiter_handshake arb_array[element_counter]; - (i:element_counter:arb_array[i].supply = supply;) - // These are the wires that connect one element of the tree to the others - a1of1 channels[element_counter*2]; - - //Connecting the first channels to the inputs - (i:N:channels[i] = in[i];) - channels[element_counter*2-1] = out; - //Now we redo the for loop but here to assign the channels to the elements - odd_element_idx = 0; - odd_element_flag = 0; - inputs_in_layer = 0; - end = N-1; - { end=4 : "Michele you did wrong" }; - // Here we start a for loop to count the elements in the tree - // The loop iterates for every successive layer - // i is the variable used to iterate the inputs, - // j counts the elements in the layer - *[ inputs_in_layer != end -> - elements_in_layer = 0; // At every layer the counter of the elements is resetted - *[ inputs_in_layer < end -> - [ inputs_in_layer + 1 >= end -> - //In this case, the number of input is even: the layer finishes - [ odd_element_flag >= 1 -> - arb_array[elements_in_layer].in1 = channels[inputs_in_layer]; - arb_array[elements_in_layer].in2 = channels[odd_element_idx]; - [] else -> - arb_array[elements_in_layer].in1 = channels[inputs_in_layer]; - arb_array[elements_in_layer].in2 = channels[inputs_in_layer+1]; - ] - inputs_in_layer = end; - odd_element_flag = 0; - [] inputs_in_layer + 2 >= end -> - //In this case, we arrived at the last input, this means the inputs are odd - //We need to save the odd input index and move it to the next layer, - //up to when the resulting number is even - odd_element_idx = end; - odd_element_flag = 1; - { end<8 : "Michele you did wrong" }; - { odd_element_idx=4 : "Michele you did wrong" }; - arb_array[elements_in_layer].in1 = channels[inputs_in_layer]; - arb_array[elements_in_layer].in2 = channels[inputs_in_layer+1]; - inputs_in_layer = end; - [] else -> - //If we are not close to the end, analyzes the next two inputs - arb_array[elements_in_layer].in1 = channels[inputs_in_layer]; - arb_array[elements_in_layer].in2 = channels[inputs_in_layer+1]; - inputs_in_layer = inputs_in_layer +2; - - ] - elements_in_layer = elements_in_layer + 1; //At every step the elements count is updated - - ] - //Move the inputs_in_layer to the next layer - //Increase the end to account for the next layer elements - //If there was an odd element, count it also in the end - inputs_in_layer = end + 1; - end = end + elements_in_layer + odd_element_flag; - element_counter = element_counter + elements_in_layer; - ] - - - - } export template defproc merge (avMx1of2 in1; avMx1of2 in2; avMx1of2 out ; bool? reset_B; power supply) {