diff --git a/dataflow_neuro/cell_lib_std.act b/dataflow_neuro/cell_lib_std.act index 849c66c..2ef126d 100644 --- a/dataflow_neuro/cell_lib_std.act +++ b/dataflow_neuro/cell_lib_std.act @@ -269,7 +269,7 @@ namespace tmpl { [keeper=0] ~a & ~s | ~b & ~_s -> _y+ a & _s | b & s -> _y- - _y => -y + _y => y- } sizing { _s{-1}; y{-1}; _y{-1}} } @@ -296,7 +296,7 @@ namespace tmpl { ~_yab & ~s1 | ~_ycd & ~_s1 -> y+ } - sizing {_s0{-1}; _s1{-1}; y{-1}; _yab{-1} _ycd{-1}} + sizing {_s0{-1}; _s1{-1}; y{-1}; _yab{-1}; _ycd{-1}} } diff --git a/dataflow_neuro/treegates.act b/dataflow_neuro/treegates.act index 17f723e..093dd6c 100644 --- a/dataflow_neuro/treegates.act +++ b/dataflow_neuro/treegates.act @@ -36,7 +36,6 @@ namespace tmpl { export deftype power (bool?! vdd, vss) { } - export template defproc ortree (bool? in[N]; bool! out; power supply) { @@ -49,7 +48,9 @@ defproc ortree (bool? in[N]; bool! out; power supply) end = N-1; pint lenTree2Count, lenTree3Count; - /* Pre"calculate" the number of C cells required, look below if confused */ + lenTree2Count = 0; + lenTree3Count = 0; + /* Pre"calculate" the number of C cells required, look below if confused */ *[ i != end -> j = 0; *[ i < end -> @@ -72,7 +73,7 @@ defproc ortree (bool? in[N]; bool! out; power supply) ] /* array that holds ALL the nodes in the completion tree */ - bool tmp[end]; + bool tmp[end+1]; (k:N:tmp[k] = in[k];) /* array to hold the actual C-elments, either A2C or A3C */ @@ -104,27 +105,26 @@ defproc ortree (bool? in[N]; bool! out; power supply) *[ i < end -> /*-- there are still signals that need to be combined --*/ j = j + 1; - bool tmp[end+j..end+j]; [ i+1 >= end -> /*-- last piece: use either a 2 input C-element --*/ - C2Els[tree2Index].c1 = tmp[i]; - C2Els[tree2Index].c2 = tmp[i+1]; + C2Els[tree2Index].a = tmp[i]; + C2Els[tree2Index].b = tmp[i+1]; C2Els[tree2Index].y = tmp[end+j]; tree2Index = tree2Index +1; i = end; [] i+2 >= end -> /*-- last piece: use either a 3 input C-element --*/ - C3Els[tree3Index].c1 = tmp[i]; - C3Els[tree3Index].c2 = tmp[i+1]; - C3Els[tree3Index].c3 = tmp[i+2]; + C3Els[tree3Index].a = tmp[i]; + C3Els[tree3Index].b = tmp[i+1]; + C3Els[tree3Index].c = tmp[i+2]; C3Els[tree3Index].y = tmp[end+j]; tree3Index = tree3Index +1; i = end; [] else -> /*-- more to come; so use a two input C-element --*/ - C2Els[tree2Index].c1 = tmp[i]; - C2Els[tree2Index].c2 = tmp[i+1]; + C2Els[tree2Index].a = tmp[i]; + C2Els[tree2Index].b = tmp[i+1]; C2Els[tree2Index].y = tmp[end+j]; tree2Index = tree2Index +1; i = i + 2; @@ -175,7 +175,7 @@ defproc ctree (bool? in[N]; bool! out; power supply) ] /* array that holds ALL the nodes in the completion tree */ - bool tmp[end]; + bool tmp[end+1]; (k:N:tmp[k] = in[k];) /* array to hold the actual C-elments, either A2C or A3C */ @@ -207,7 +207,6 @@ defproc ctree (bool? in[N]; bool! out; power supply) *[ i < end -> /*-- there are still signals that need to be combined --*/ j = j + 1; - bool tmp[end+j..end+j]; [ i+1 >= end -> /*-- last piece: use either a 2 input C-element --*/ C2Els[tree2Index].c1 = tmp[i]; diff --git a/test/unit_tests/init.prs b/test/unit_tests/init.prs index 0ff1a11..1e7d3e0 100644 --- a/test/unit_tests/init.prs +++ b/test/unit_tests/init.prs @@ -1,2 +1,2 @@ = "GND" "GND" -= "Vdd" "Vdd" \ No newline at end of file += "Vdd" "Vdd" diff --git a/test/unit_tests/ortree_15/run/prsim.out b/test/unit_tests/ortree_15/run/prsim.out new file mode 100644 index 0000000..99e201a --- /dev/null +++ b/test/unit_tests/ortree_15/run/prsim.out @@ -0,0 +1,2 @@ +t.ortree_test.tmp[18] t.in[6] t.in[5] t.in[12] t.ortree_test.tmp[16] t.ortree_test.tmp[22] t.in[9] t.in[13] t.ortree_test.tmp[25] t.in[4] t.in[8] t.in[7] t.in[14] t.ortree_test.tmp[19] t.in[0] t.in[3] t.ortree_test.C2Els[1]._y t.ortree_test.C3Els[1]._y t.in[10] t.in[1] t.in[11] t.in[2] t.ortree_test.C2Els[4]._y t.ortree_test.tmp[20] t.ortree_test.tmp[17] t.ortree_test.tmp[21] t.ortree_test.tmp[23] t.ortree_test.C3Els[0]._y t.ortree_test.C2Els[2]._y t.ortree_test.tmp[24] t.ortree_test.tmp[15] t.ortree_test.C3Els[2]._y t.ortree_test.C2Els[6]._y t.ortree_test.C2Els[3]._y t.ortree_test.C2Els[5]._y t.ortree_test.C2Els[7]._y t.ortree_test.C2Els[0]._y +reset complete diff --git a/test/unit_tests/ortree_15/run/test.prs b/test/unit_tests/ortree_15/run/test.prs index 0ff1a11..4169e4e 100644 --- a/test/unit_tests/ortree_15/run/test.prs +++ b/test/unit_tests/ortree_15/run/test.prs @@ -1,2 +1,137 @@ = "GND" "GND" -= "Vdd" "Vdd" \ No newline at end of file += "Vdd" "Vdd" +"t.ortree_test.C2Els[0].a"|"t.ortree_test.C2Els[0].b"->"t.ortree_test.C2Els[0]._y"- +~("t.ortree_test.C2Els[0].a"|"t.ortree_test.C2Els[0].b")->"t.ortree_test.C2Els[0]._y"+ +"t.ortree_test.C2Els[0]._y"->"t.ortree_test.C2Els[0].y"- +~("t.ortree_test.C2Els[0]._y")->"t.ortree_test.C2Els[0].y"+ +"t.ortree_test.C2Els[1].a"|"t.ortree_test.C2Els[1].b"->"t.ortree_test.C2Els[1]._y"- +~("t.ortree_test.C2Els[1].a"|"t.ortree_test.C2Els[1].b")->"t.ortree_test.C2Els[1]._y"+ +"t.ortree_test.C2Els[1]._y"->"t.ortree_test.C2Els[1].y"- +~("t.ortree_test.C2Els[1]._y")->"t.ortree_test.C2Els[1].y"+ +"t.ortree_test.C2Els[2].a"|"t.ortree_test.C2Els[2].b"->"t.ortree_test.C2Els[2]._y"- +~("t.ortree_test.C2Els[2].a"|"t.ortree_test.C2Els[2].b")->"t.ortree_test.C2Els[2]._y"+ +"t.ortree_test.C2Els[2]._y"->"t.ortree_test.C2Els[2].y"- +~("t.ortree_test.C2Els[2]._y")->"t.ortree_test.C2Els[2].y"+ +"t.ortree_test.C2Els[3].a"|"t.ortree_test.C2Els[3].b"->"t.ortree_test.C2Els[3]._y"- +~("t.ortree_test.C2Els[3].a"|"t.ortree_test.C2Els[3].b")->"t.ortree_test.C2Els[3]._y"+ +"t.ortree_test.C2Els[3]._y"->"t.ortree_test.C2Els[3].y"- +~("t.ortree_test.C2Els[3]._y")->"t.ortree_test.C2Els[3].y"+ +"t.ortree_test.C2Els[4].a"|"t.ortree_test.C2Els[4].b"->"t.ortree_test.C2Els[4]._y"- +~("t.ortree_test.C2Els[4].a"|"t.ortree_test.C2Els[4].b")->"t.ortree_test.C2Els[4]._y"+ +"t.ortree_test.C2Els[4]._y"->"t.ortree_test.C2Els[4].y"- +~("t.ortree_test.C2Els[4]._y")->"t.ortree_test.C2Els[4].y"+ +"t.ortree_test.C2Els[5].a"|"t.ortree_test.C2Els[5].b"->"t.ortree_test.C2Els[5]._y"- +~("t.ortree_test.C2Els[5].a"|"t.ortree_test.C2Els[5].b")->"t.ortree_test.C2Els[5]._y"+ +"t.ortree_test.C2Els[5]._y"->"t.ortree_test.C2Els[5].y"- +~("t.ortree_test.C2Els[5]._y")->"t.ortree_test.C2Els[5].y"+ +"t.ortree_test.C2Els[6].a"|"t.ortree_test.C2Els[6].b"->"t.ortree_test.C2Els[6]._y"- +~("t.ortree_test.C2Els[6].a"|"t.ortree_test.C2Els[6].b")->"t.ortree_test.C2Els[6]._y"+ +"t.ortree_test.C2Els[6]._y"->"t.ortree_test.C2Els[6].y"- +~("t.ortree_test.C2Els[6]._y")->"t.ortree_test.C2Els[6].y"+ +"t.ortree_test.C2Els[7].a"|"t.ortree_test.C2Els[7].b"->"t.ortree_test.C2Els[7]._y"- +~("t.ortree_test.C2Els[7].a"|"t.ortree_test.C2Els[7].b")->"t.ortree_test.C2Els[7]._y"+ +"t.ortree_test.C2Els[7]._y"->"t.ortree_test.C2Els[7].y"- +~("t.ortree_test.C2Els[7]._y")->"t.ortree_test.C2Els[7].y"+ +"t.ortree_test.C3Els[0].a"|"t.ortree_test.C3Els[0].b"|"t.ortree_test.C3Els[0].c"->"t.ortree_test.C3Els[0]._y"- +~("t.ortree_test.C3Els[0].a"|"t.ortree_test.C3Els[0].b"|"t.ortree_test.C3Els[0].c")->"t.ortree_test.C3Els[0]._y"+ +"t.ortree_test.C3Els[0]._y"->"t.ortree_test.C3Els[0].y"- +~("t.ortree_test.C3Els[0]._y")->"t.ortree_test.C3Els[0].y"+ +"t.ortree_test.C3Els[1].a"|"t.ortree_test.C3Els[1].b"|"t.ortree_test.C3Els[1].c"->"t.ortree_test.C3Els[1]._y"- +~("t.ortree_test.C3Els[1].a"|"t.ortree_test.C3Els[1].b"|"t.ortree_test.C3Els[1].c")->"t.ortree_test.C3Els[1]._y"+ +"t.ortree_test.C3Els[1]._y"->"t.ortree_test.C3Els[1].y"- +~("t.ortree_test.C3Els[1]._y")->"t.ortree_test.C3Els[1].y"+ +"t.ortree_test.C3Els[2].a"|"t.ortree_test.C3Els[2].b"|"t.ortree_test.C3Els[2].c"->"t.ortree_test.C3Els[2]._y"- +~("t.ortree_test.C3Els[2].a"|"t.ortree_test.C3Els[2].b"|"t.ortree_test.C3Els[2].c")->"t.ortree_test.C3Els[2]._y"+ +"t.ortree_test.C3Els[2]._y"->"t.ortree_test.C3Els[2].y"- +~("t.ortree_test.C3Els[2]._y")->"t.ortree_test.C3Els[2].y"+ += "t.ortree_test.tmp[15]" "t.ortree_test.C2Els[6].a" += "t.ortree_test.tmp[15]" "t.ortree_test.C2Els[0].y" += "t.ortree_test.tmp[16]" "t.ortree_test.C2Els[6].b" += "t.ortree_test.tmp[16]" "t.ortree_test.C2Els[1].y" += "t.ortree_test.tmp[17]" "t.ortree_test.C2Els[7].a" += "t.ortree_test.tmp[17]" "t.ortree_test.C2Els[2].y" += "t.ortree_test.tmp[18]" "t.ortree_test.C2Els[7].b" += "t.ortree_test.tmp[18]" "t.ortree_test.C2Els[3].y" += "t.ortree_test.tmp[19]" "t.ortree_test.C3Els[1].a" += "t.ortree_test.tmp[19]" "t.ortree_test.C2Els[4].y" += "t.ortree_test.tmp[20]" "t.ortree_test.C3Els[1].b" += "t.ortree_test.tmp[20]" "t.ortree_test.C2Els[5].y" += "t.ortree_test.tmp[21]" "t.ortree_test.C3Els[1].c" += "t.ortree_test.tmp[21]" "t.ortree_test.C3Els[0].y" += "t.ortree_test.tmp[22]" "t.ortree_test.C3Els[2].a" += "t.ortree_test.tmp[22]" "t.ortree_test.C2Els[6].y" += "t.ortree_test.tmp[23]" "t.ortree_test.C3Els[2].b" += "t.ortree_test.tmp[23]" "t.ortree_test.C2Els[7].y" += "t.ortree_test.tmp[24]" "t.ortree_test.C3Els[2].c" += "t.ortree_test.tmp[24]" "t.ortree_test.C3Els[1].y" += "t.ortree_test.tmp[25]" "t.ortree_test.C3Els[2].y" += "t.ortree_test.supply.vdd" "t.ortree_test.C3Els[2].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C3Els[1].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C3Els[0].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[7].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[6].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[5].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[4].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[3].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[2].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[1].vdd" += "t.ortree_test.supply.vdd" "t.ortree_test.C2Els[0].vdd" += "t.ortree_test.supply.vss" "t.ortree_test.C3Els[2].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C3Els[1].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C3Els[0].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[7].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[6].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[5].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[4].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[3].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[2].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[1].vss" += "t.ortree_test.supply.vss" "t.ortree_test.C2Els[0].vss" += "t.ortree_test.in[0]" "t.ortree_test.C2Els[0].a" += "t.ortree_test.in[0]" "t.ortree_test.tmp[0]" += "t.ortree_test.in[1]" "t.ortree_test.C2Els[0].b" += "t.ortree_test.in[1]" "t.ortree_test.tmp[1]" += "t.ortree_test.in[2]" "t.ortree_test.C2Els[1].a" += "t.ortree_test.in[2]" "t.ortree_test.tmp[2]" += "t.ortree_test.in[3]" "t.ortree_test.C2Els[1].b" += "t.ortree_test.in[3]" "t.ortree_test.tmp[3]" += "t.ortree_test.in[4]" "t.ortree_test.C2Els[2].a" += "t.ortree_test.in[4]" "t.ortree_test.tmp[4]" += "t.ortree_test.in[5]" "t.ortree_test.C2Els[2].b" += "t.ortree_test.in[5]" "t.ortree_test.tmp[5]" += "t.ortree_test.in[6]" "t.ortree_test.C2Els[3].a" += "t.ortree_test.in[6]" "t.ortree_test.tmp[6]" += "t.ortree_test.in[7]" "t.ortree_test.C2Els[3].b" += "t.ortree_test.in[7]" "t.ortree_test.tmp[7]" += "t.ortree_test.in[8]" "t.ortree_test.C2Els[4].a" += "t.ortree_test.in[8]" "t.ortree_test.tmp[8]" += "t.ortree_test.in[9]" "t.ortree_test.C2Els[4].b" += "t.ortree_test.in[9]" "t.ortree_test.tmp[9]" += "t.ortree_test.in[10]" "t.ortree_test.C2Els[5].a" += "t.ortree_test.in[10]" "t.ortree_test.tmp[10]" += "t.ortree_test.in[11]" "t.ortree_test.C2Els[5].b" += "t.ortree_test.in[11]" "t.ortree_test.tmp[11]" += "t.ortree_test.in[12]" "t.ortree_test.C3Els[0].a" += "t.ortree_test.in[12]" "t.ortree_test.tmp[12]" += "t.ortree_test.in[13]" "t.ortree_test.C3Els[0].b" += "t.ortree_test.in[13]" "t.ortree_test.tmp[13]" += "t.ortree_test.in[14]" "t.ortree_test.C3Els[0].c" += "t.ortree_test.in[14]" "t.ortree_test.tmp[14]" += "Vdd" "t.ortree_test.supply.vdd" += "GND" "t.ortree_test.supply.vss" += "t.out" "t.ortree_test.out" += "t.in[0]" "t.ortree_test.in[0]" += "t.in[1]" "t.ortree_test.in[1]" += "t.in[2]" "t.ortree_test.in[2]" += "t.in[3]" "t.ortree_test.in[3]" += "t.in[4]" "t.ortree_test.in[4]" += "t.in[5]" "t.ortree_test.in[5]" += "t.in[6]" "t.ortree_test.in[6]" += "t.in[7]" "t.ortree_test.in[7]" += "t.in[8]" "t.ortree_test.in[8]" += "t.in[9]" "t.ortree_test.in[9]" += "t.in[10]" "t.ortree_test.in[10]" += "t.in[11]" "t.ortree_test.in[11]" += "t.in[12]" "t.ortree_test.in[12]" += "t.in[13]" "t.ortree_test.in[13]" += "t.in[14]" "t.ortree_test.in[14]" diff --git a/test/unit_tests/ortree_15/test.act b/test/unit_tests/ortree_15/test.act index 0d6a4d8..3c8f385 100644 --- a/test/unit_tests/ortree_15/test.act +++ b/test/unit_tests/ortree_15/test.act @@ -27,6 +27,7 @@ */ import "../../dataflow_neuro/treegates.act"; +import globals; open tmpl::dataflow_neuro; @@ -37,3 +38,4 @@ defproc ortree_15 (bool? in[15]; bool! out){ } +ortree_15 t; \ No newline at end of file diff --git a/test/unit_tests/ortree_15/test.prsim b/test/unit_tests/ortree_15/test.prsim index 1e3f700..1a9923c 100644 --- a/test/unit_tests/ortree_15/test.prsim +++ b/test/unit_tests/ortree_15/test.prsim @@ -1,3 +1,5 @@ +system "echo 'reset complete'" + set-bool-array "t.in" 15 0 cycle mode run