From fc4ccea3c05c6356d0f4d7f60bc301945d653dd4 Mon Sep 17 00:00:00 2001 From: alexmadison Date: Tue, 1 Mar 2022 12:22:36 +0100 Subject: [PATCH] added and tree --- dataflow_neuro/treegates.act | 116 ++++++++++++++++++- test/unit_tests/andtree_15/run/prsim.out | 118 +++++++++++++++++++ test/unit_tests/andtree_15/run/prsim.pdf | Bin 0 -> 32510 bytes test/unit_tests/andtree_15/run/test.prs | 139 +++++++++++++++++++++++ test/unit_tests/andtree_15/test.act | 41 +++++++ test/unit_tests/andtree_15/test.prsim | 110 ++++++++++++++++++ test/unit_tests/andtree_5/run/prsim.out | 40 +++++++ test/unit_tests/andtree_5/run/prsim.pdf | Bin 0 -> 17643 bytes test/unit_tests/andtree_5/run/test.prs | 45 ++++++++ test/unit_tests/andtree_5/test.act | 41 +++++++ test/unit_tests/andtree_5/test.prsim | 50 ++++++++ 11 files changed, 698 insertions(+), 2 deletions(-) create mode 100644 test/unit_tests/andtree_15/run/prsim.out create mode 100644 test/unit_tests/andtree_15/run/prsim.pdf create mode 100644 test/unit_tests/andtree_15/run/test.prs create mode 100644 test/unit_tests/andtree_15/test.act create mode 100644 test/unit_tests/andtree_15/test.prsim create mode 100644 test/unit_tests/andtree_5/run/prsim.out create mode 100644 test/unit_tests/andtree_5/run/prsim.pdf create mode 100644 test/unit_tests/andtree_5/run/test.prs create mode 100644 test/unit_tests/andtree_5/test.act create mode 100644 test/unit_tests/andtree_5/test.prsim diff --git a/dataflow_neuro/treegates.act b/dataflow_neuro/treegates.act index eac8c89..c075e44 100644 --- a/dataflow_neuro/treegates.act +++ b/dataflow_neuro/treegates.act @@ -3,6 +3,9 @@ * This file is part of ACT dataflow neuro library * * Copyright (c) 2022 University of Groningen - Ole Richter + * Copyright (c) 2022 University of Groningen - Madison Cotteret + * Copyright (c) 2022 University of Groningen - Hugh Greatorex + * Copyright (c) 2022 University of Groningen - Michele Mastella * Copyright (c) 2021 Rajit Manohar * * This source describes Open Hardware and is licensed under the CERN-OHL-W v2 or later @@ -79,12 +82,121 @@ defproc ortree (bool? in[N]; bool! out; power supply) /* array to hold the actual C-elments, either A2C or A3C */ - [lenTree2Count > 0 -> + [lenTree2Count > 0 -> OR2_X1 C2Els[lenTree2Count]; ] [lenTree3Count > 0 -> - OR3_X1 C3Els[lenTree3Count]; + OR3_X1 C3Els[lenTree3Count]; + ] + + (h:lenTree2Count:C2Els[h].vdd = supply.vdd;) + (h:lenTree3Count:C3Els[h].vdd = supply.vdd;) + + (h:lenTree2Count:C2Els[h].vss = supply.vss;) + (h:lenTree3Count:C3Els[h].vss = supply.vss;) + + /* Reset the variables we just stole lol */ + i = 0; + end = N-1; + j = 0; + pint tree2Index = 0; + pint tree3Index = 0; + + /* Invariant: i <= end */ + + *[ i != end -> + /* + * Invariant: tmp[i..end] has the current signals that need to be + * combined together, and "isinv" specifies if they are the inverted + * sense or not + */ + j = 0; + *[ i < end -> + /*-- there are still signals that need to be combined --*/ + j = j + 1; + [ i+1 >= end -> + /*-- last piece: use either a 2 input C-element --*/ + 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].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].a = tmp[i]; + C2Els[tree2Index].b = tmp[i+1]; + C2Els[tree2Index].y = tmp[end+j]; + tree2Index = tree2Index +1; + i = i + 2; + ] + ] + /*-- update range that has to be combined --*/ + i = end+1; + end = end+j; + j = 0; + ] + + out = tmp[end]; +} + +export template +defproc andtree (bool? in[N]; bool! out; power supply) +{ + bool tout; + + { N > 0 : "What?" }; + + pint i, end, j; + i = 0; + end = N-1; + + pint lenTree2Count, lenTree3Count; + lenTree2Count = 0; + lenTree3Count = 0; + /* Pre"calculate" the number of C cells required, look below if confused */ + *[ i != end -> + j = 0; + *[ i < end -> + j = j + 1; + [ i+1 >= end -> + i = end; + lenTree2Count = lenTree2Count +1; + [] i+2 >= end -> + i = end; + lenTree3Count = lenTree3Count +1; + [] else -> + i = i + 2; + lenTree2Count = lenTree2Count +1; + ] + ] + /*-- update range that has to be combined --*/ + i = end+1; + end = end+j; + j = 0; + ] + + /* array that holds ALL the nodes in the completion tree */ + bool tmp[end+1]; + (k:N:tmp[k] = in[k];) + + /* array to hold the actual C-elments, either A2C or A3C */ + + [lenTree2Count > 0 -> + AND2_X1 C2Els[lenTree2Count]; + ] + + [lenTree3Count > 0 -> + AND3_X1 C3Els[lenTree3Count]; ] (h:lenTree2Count:C2Els[h].vdd = supply.vdd;) diff --git a/test/unit_tests/andtree_15/run/prsim.out b/test/unit_tests/andtree_15/run/prsim.out new file mode 100644 index 0000000..15f5736 --- /dev/null +++ b/test/unit_tests/andtree_15/run/prsim.out @@ -0,0 +1,118 @@ +t.in[0] t.at.tmp[22] t.in[5] t.in[2] t.at.tmp[15] t.in[3] t.at.tmp[23] t.at.C2Els[0]._y t.in[7] t.in[6] t.at.C2Els[3]._y t.in[4] t.at.C3Els[0]._y t.in[12] t.out t.at.tmp[21] t.at.C2Els[6]._y t.in[11] t.at.tmp[17] t.in[14] t.in[1] t.in[10] t.in[9] t.at.C2Els[5]._y t.at.tmp[19] t.at.tmp[20] t.at.tmp[24] t.in[13] t.at.tmp[16] t.at.C2Els[4]._y t.in[8] t.at.tmp[18] t.at.C2Els[2]._y t.at.C3Els[2]._y t.at.C2Els[1]._y t.at.C2Els[7]._y t.at.C3Els[1]._y +0 +1 + 0 t.in[0] : 0 + 0 t.in[14] : 0 + 0 t.in[2] : 0 + 0 t.in[6] : 0 + 0 t.in[13] : 0 + 0 t.in[5] : 0 + 0 t.in[12] : 0 + 0 t.in[11] : 0 + 0 t.in[1] : 0 + 0 t.in[4] : 0 + 0 t.in[10] : 0 + 0 t.in[9] : 0 + 0 t.in[3] : 0 + 0 t.in[8] : 0 + 0 t.in[7] : 0 + 1 t.at.C2Els[0]._y : 1 [by t.in[0]:=0] + 2 t.at.C2Els[3]._y : 1 [by t.in[6]:=0] + 114 t.at.C2Els[4]._y : 1 [by t.in[9]:=0] + 153 t.at.tmp[19] : 0 [by t.at.C2Els[4]._y:=1] + 168 t.at.C3Els[1]._y : 1 [by t.at.tmp[19]:=0] + 659 t.at.tmp[24] : 0 [by t.at.C3Els[1]._y:=1] + 672 t.at.C3Els[2]._y : 1 [by t.at.tmp[24]:=0] + 712 t.out : 0 [by t.at.C3Els[2]._y:=1] + 1137 t.at.C2Els[5]._y : 1 [by t.in[11]:=0] + 1552 t.at.tmp[20] : 0 [by t.at.C2Els[5]._y:=1] + 1728 t.at.tmp[18] : 0 [by t.at.C2Els[3]._y:=1] + 1748 t.at.C2Els[7]._y : 1 [by t.at.tmp[18]:=0] + 4753 t.at.C2Els[2]._y : 1 [by t.in[5]:=0] + 4800 t.at.tmp[17] : 0 [by t.at.C2Els[2]._y:=1] + 7092 t.at.C3Els[0]._y : 1 [by t.in[14]:=0] + 7108 t.at.tmp[21] : 0 [by t.at.C3Els[0]._y:=1] + 7809 t.at.tmp[23] : 0 [by t.at.C2Els[7]._y:=1] + 10467 t.at.C2Els[1]._y : 1 [by t.in[2]:=0] + 54565 t.at.tmp[16] : 0 [by t.at.C2Els[1]._y:=1] + 65367 t.at.tmp[15] : 0 [by t.at.C2Els[0]._y:=1] + 68289 t.at.C2Els[6]._y : 1 [by t.at.tmp[16]:=0] + 68293 t.at.tmp[22] : 0 [by t.at.C2Els[6]._y:=1] +[] setting some bits high + 68293 t.in[0] : 1 + 68293 t.in[11] : 1 + 68293 t.in[10] : 1 + 68293 t.in[9] : 1 + 68293 t.in[2] : 1 + 68293 t.in[8] : 1 + 68293 t.in[7] : 1 + 68293 t.in[6] : 1 + 68293 t.in[5] : 1 + 68293 t.in[1] : 1 + 68293 t.in[4] : 1 + 68293 t.in[3] : 1 + 68308 t.at.C2Els[4]._y : 0 [by t.in[8]:=1] + 68348 t.at.C2Els[2]._y : 0 [by t.in[4]:=1] + 77422 t.at.C2Els[5]._y : 0 [by t.in[10]:=1] + 82197 t.at.tmp[17] : 1 [by t.at.C2Els[2]._y:=0] + 98088 t.at.tmp[19] : 1 [by t.at.C2Els[4]._y:=0] + 102234 t.at.tmp[20] : 1 [by t.at.C2Els[5]._y:=0] + 105224 t.at.C2Els[0]._y : 0 [by t.in[1]:=1] + 111541 t.at.C2Els[3]._y : 0 [by t.in[6]:=1] + 111963 t.at.tmp[18] : 1 [by t.at.C2Els[3]._y:=0] + 119567 t.at.tmp[15] : 1 [by t.at.C2Els[0]._y:=0] + 119946 t.at.C2Els[1]._y : 0 [by t.in[3]:=1] + 119947 t.at.tmp[16] : 1 [by t.at.C2Els[1]._y:=0] + 119948 t.at.C2Els[6]._y : 0 [by t.at.tmp[16]:=1] + 140153 t.at.tmp[22] : 1 [by t.at.C2Els[6]._y:=0] + 160677 t.at.C2Els[7]._y : 0 [by t.at.tmp[18]:=1] + 160959 t.at.tmp[23] : 1 [by t.at.C2Els[7]._y:=0] +[] setting all bits high + 160959 t.in[12] : 1 + 160959 t.in[14] : 1 + 160959 t.in[13] : 1 + 161727 t.at.C3Els[0]._y : 0 [by t.in[13]:=1] + 161730 t.at.tmp[21] : 1 [by t.at.C3Els[0]._y:=0] + 184171 t.at.C3Els[1]._y : 0 [by t.at.tmp[21]:=1] + 184722 t.at.tmp[24] : 1 [by t.at.C3Els[1]._y:=0] + 185793 t.at.C3Els[2]._y : 0 [by t.at.tmp[24]:=1] + 186747 t.out : 1 [by t.at.C3Els[2]._y:=0] +[] setting some low + 186747 t.in[10] : 0 + 187828 t.at.C2Els[5]._y : 1 [by t.in[10]:=0] + 242298 t.at.tmp[20] : 0 [by t.at.C2Els[5]._y:=1] + 243280 t.at.C3Els[1]._y : 1 [by t.at.tmp[20]:=0] + 243298 t.at.tmp[24] : 0 [by t.at.C3Els[1]._y:=1] + 247311 t.at.C3Els[2]._y : 1 [by t.at.tmp[24]:=0] + 251314 t.out : 0 [by t.at.C3Els[2]._y:=1] +[] setting all low + 251314 t.in[0] : 0 + 251314 t.in[14] : 0 + 251314 t.in[2] : 0 + 251314 t.in[6] : 0 + 251314 t.in[5] : 0 + 251314 t.in[13] : 0 + 251314 t.in[12] : 0 + 251314 t.in[1] : 0 + 251314 t.in[4] : 0 + 251314 t.in[11] : 0 + 251314 t.in[9] : 0 + 251314 t.in[3] : 0 + 251314 t.in[8] : 0 + 251314 t.in[7] : 0 + 251517 t.at.C2Els[2]._y : 1 [by t.in[5]:=0] + 251656 t.at.tmp[17] : 0 [by t.at.C2Els[2]._y:=1] + 251816 t.at.C2Els[3]._y : 1 [by t.in[6]:=0] + 251885 t.at.tmp[18] : 0 [by t.at.C2Els[3]._y:=1] + 253168 t.at.C2Els[4]._y : 1 [by t.in[9]:=0] + 253179 t.at.tmp[19] : 0 [by t.at.C2Els[4]._y:=1] + 256074 t.at.C2Els[1]._y : 1 [by t.in[2]:=0] + 272898 t.at.C3Els[0]._y : 1 [by t.in[14]:=0] + 273102 t.at.tmp[21] : 0 [by t.at.C3Els[0]._y:=1] + 288002 t.at.C2Els[7]._y : 1 [by t.at.tmp[17]:=0] + 288017 t.at.tmp[23] : 0 [by t.at.C2Els[7]._y:=1] + 296215 t.at.C2Els[0]._y : 1 [by t.in[0]:=0] + 296216 t.at.tmp[15] : 0 [by t.at.C2Els[0]._y:=1] + 296253 t.at.C2Els[6]._y : 1 [by t.at.tmp[15]:=0] + 296992 t.at.tmp[22] : 0 [by t.at.C2Els[6]._y:=1] + 307860 t.at.tmp[16] : 0 [by t.at.C2Els[1]._y:=1] diff --git a/test/unit_tests/andtree_15/run/prsim.pdf b/test/unit_tests/andtree_15/run/prsim.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ab3d9a31506b9e4275f9b508c6f94f89cf973af8 GIT binary patch literal 32510 zcmbTeWmKF?vj&>r4#8c6yE_CA?hXlqySux)LvRo7?(XjHuEG6IvcGfh+2`za)?WA5 z%-hpl_0&_<-SzhB8d5o7QCdbi78ugfRl<^H7)C+{LMvTU7#h2iO}Bvivnj)XLJHkom9gasYdK z16xZ%*58jX^m4XVdWr`2gqlD-!lFR=2F~_`^x_skor3@Q6#CDnIH5Kny`nKd-^9|0 zknOMGYO=bf272~{?02%@QL#;0b;gR4%URf z%@k53q!%`DG|@9q5Cf_PJ}KD(EbXiTwg#4ZF8^iuU;TlK=%o$xO#p&c&Oo`pl`%52 zveU6Jv9K~TvvM#o5^`{G&@r(wb270rF>`SIRxS5ilKo#q!q6)i*jYK)>H(SkP2K;? z>~FIF8?C=l{+Ah|Cgwoq2F4F?{LCH1-_iP*e8Lg{c3Wre@(wL%PWLgn%#S@SX~Erazgs>9v8R1H6${N?*0ZAjuS-h}r!;9jDm!rF4({8sP1dZ>mvK<)ZB&>B}x)xrR?~O|N z0xiLw?@AN6lGQ%kyXWqmPNCRdmZv^Z&Ke8t2sueqPuFY%G(@WAEjUbzemoahxeo~Z zDv^95re4vSc#}^R(wmQleI`~?bf0K5T@{MJoF2C@J~wu)g-PvxJa&gX&c?Kl>vjdD zUvI($tEkIc-d*4osRfs-1=uCS(_m*pSM;}54J}@Q;Y+iWkscIM3uuU34<33qH4-wR zp8SIQiI$095IAXnJth>OLBI`zWxSsuXy5mS{Yp4L9~KkdKS9Y_o4w})5wNM!27s@9 zP%&jJPfB-OV-`6KV)Ehz*`X2tAO<}jKb4ug4hRTvd!c0ht%!LEL|OGU6>1H&D}~^e6YZD2MD4p zGu%i!VNYy+B;*O#zwwKNKum<}=Y@Ei4@_k}2-!pyZ7(Mx!^;HSm(7jB3xG4O&p9)z z?GWX+rc5v^YIRTMzv6MuXbAepIDSz!Qj7ZX1HH`r4rWx7(}af4kO#26k%-U5cktb3_}JSo9;h=!XW4v! z>+88ofoCw z+{(J%9+8o92Lkrt;w_-IDmQ-XOD?#S#?wM_pxly5XiT^XRE_kA$+kR)UG9R~bXuB* zF2Ow7Y>`S(AAfuyDWZrOezQ7@*<4_8U~yZN>wrTWBg7(ir4{HXc#_HY+kR;WICwoS zzvlibjGo>#$u+rUdNqjP?qa${Qe6Z$-HV{QPiZ9m=A9~IB3&g;xVOS#JC+C(8sK%e zC@_2bm=c~ti#DYKhskQN5&EU7$!>BUV?8}ztawFbC{pVR1)|hrO2y!Pbi0R)h03CQ z6d>4;$|W-AJ497&Rn-2hvga-){shTTWgY2^$*Oktt&E3PW>`$0Al7>AsafSJhs&K z{-4XIi?F4?VK;GyM&K5&>Y>2RDEM>e)%V4MGoQCzq->vTC?IT8ROfb7~ z+6{D|WlbVSm4re^T6!>P?LmjZa&Y%uMoFx9u-a5OnxJj0gg~hF zrB{erH!I$o*RLc^d8}eeNNcy$6wGee-Z&s7peIzl36ec6-JDvX?iQzLF0eb{JW#*v zpsR;vn6OOKT1l?%R-mD=9HU^Dp)M<*k>2@~y(P^41j({e!c@*$V(|cwZw_Vxu~i0d z-0ADHM+mLaMv-CcM|n!oFteH4KnzHRSm@=KWG|7uF_$tPh*eJ=lxu{9h8w?`j1_X; zkCZlHq7m%Hoi<%{h8ypsrggT(pUc(6)BJEKexjQd{RyzeZ39(8ASTs;@H#XYk?f{@ zkroFJyP1X&wN)Ao1Ii?W$*m5eB8GIRVs{kIMLG@4)B4|(33WeW43ME!wGXrY7 z@X12Y(tDItbQ1jckER(YzMZ*+ZIKFXO;WWriZa=Ud&#G#LSm$?iui7a?@`*IJWSr^ zwk;h7ObsszNO3vfz|5ExT!f=3|kp)&gV`f=-7BfEn9}AgQoVsHgr0M|Gr;HE z;kL;HfOF-}Exw39@z}S}GgIee7+bfYION<2L?q-&8c}mikC~3X)a0oVEoNN0Tip_jE05~~9;8D{Po0i$E4QInwM%qFZj`YW23+A%$lrJn5&_6Fkw##E^U zxLdkNTu#>LX5)y+tI!q|vtvIO>1iz@GCr#+<+4|aSNioxjYkIGf|3N0)pR%1kxjLd zY3M^)l_=!XwqsE-NO1T!`2$Dvdv(;SjuXy0sye)5Pr? z7XwdkToN`t9>u&cW8amlPjR+D0w3I4HV=t&k$M$_MGi*^y3(y;na3j_Ex zB)sQqVK}fSkaw1?R1&B&+-qt@?3cdn{sDxX8RN=a)s@~Hs?LyTcrX*-T-7v-oC!m# zMK*A=t9>7f_H@J4VmV+TVN18we2U{Da<`>$&qyK%qKlc5G*KexTlZ{n7%Qw zbOc&>2ZW>hC61=FTy-D!>T&xFC9 ziL}8YX7p}Nh};M;42+-Q@ID{Pjmc8%^J=)fk_v9MiKQNBFra#`MNA}uHw3FelmyGA zHRXmQ0oQFa5zE9afwBl-UQ$rFco@mn5jp9Z!@c}k+}+YK-gB7x5mW zz!yUK7`VR!BODbN;VQrg#{ow89p5n?#$Ep?tTh8w<w-G#8#CHTsb)4;ZJgE!h*KZ_0=iG7 z$qjC*OyPVe9frrHf@<$)+@AYrzow)};1GVorF)Q#5*2=k=iyk(*+NvW-O3)d#WFem zL$#e9AJPZYqxyEr1!;dNwKaWw5ta={UKG@zxmX8f2OOV&kE}c_E~cQi0%C^^*|hvu zqoCUsiF4g<-RWs-n!h_l5=LY#|L*E zl?_)+Wb_KlW>x9z>;UkFQX4oWQ4is%G0*&1F=FY|B1DJ|R91t5kyAtMs_`a&U6|RfzhG z{EudcC;I1!_MhQZeakWhBiP{DPh`YZTvd3aaw+DEp_Sp4?FeonU|WbmhcV$2&2L~b zJY1#L1bV=@cSe;Kg$}f7T9e7kxI}Yiu*P6h#Kn}5q}3E{C#Nv5=c=$FHb}T@cRzvW zxEv;b>T>~0E?SOILoI{BYnsN=#&D@O^orQSAKU$b7Cwi+qKE&WfsTKop6@haeb>sn z<5qR6STxn&S@)k@vwm2oEESk*vfs&1G%`dEGd?W<&MnyN1J1u6Hh{A|P<+6}x|Elg zjzRQBDMlFXgOK?85iWE(HL?V$u_rMX))5S#rWRm63SRL6k=g?hg3;XmG#J1yC@rNe zrWHCBfuOf_W)$dUFC}|-e;#rszCSoM%}aijJR=2x6F5HNkK)o9@J-RG#1xQ^t(~Rx zGoQK-kx7vo{=7h2Oj??r^dCPf-u)Y8mEO2xANBaXTCK&_h zNLw5EXaYoTGP%-|MpY+PDC`qNwZNQ*f!{^LkFvv8s@eiwIvKO$ZHY^`11@L!=5d381_BMmiG;c?~;LGs0EwSRh4 zrlguwvX5~cn{ssl3Y)5v95a&b1X6PD@boyV4D{mtV747w8TPQ+0mSWi73i)TiWwli z>fZa=11bY?J;Po5)l)_#eiQJedUMiUP!{adVz{k<+@5{-=T8P!$6SKHA}sB}_+hn5 ziJp$`lhsJ*xn!m}cl30B#6eencrCe0@c{clL9|&=4m01(2riT)`ZU=J(9@KtTA(dC zE`IKk?`W#bbq%y=KIcG8wf3B#kUhO#gjBL;N5Rsew8>AEvmSDdzHH|ciDd5k=(*F( z?z12JnC1Fp=b+T=!h@yKYn+4sW;{lA`%+(2=K&nz{e@P6d6(ug5sdNszBx9< zt;Bw@z%ZQS02lkpJ+t~8Y_`xU@D}0(`!dJAewJyOwc0~5T8AA1`vmG1LnkSJpT2G| z>yP)XgWjaVTNzkLx_5JdAD~yO;&!#6&=_`8z=*_*>5ngoeQ-vv%7tR!ib0ZC_`1`= z4?m$8Bp)JC^|%XbrI)VStys3M_izpx_XM2ly_Xv znZ+eCJ%#pq*OyngCs0^+orYIT>F;*&lcd!HcAh(;2^Cu+LNrp zG4mPKT&a?&L-JUz78U)N)N+qzom$<1zNmdXXwW;n^Y&x}#0Y(LSno?9O{q2CF&5Xi zU}hc2eLU?$Soc`Fm-Uk3ikS<>VVoV|YG(Y-i`d1APSia@zCaw+`0;+Xq}pHxm8voA zE|tM8>WX5gKF~!~i5Iq z877S{4~IBJd+{;X9zji-aQnjuh*#2$%f~QZTx>$eCI|HNObGw?+kCa>R{h?5o6xw(8>`!LLf6-ue>b+WNj;3^)#ve74O?Lo6JwOlcp=hLjaD(~TxiV&dmkWGFnv0FhVaE92auQXm? zEla@|{!%d`cGRlx$k{)aPO=HFY&Z*0+g6d;Ig?%@$9c&)t`UK;vPBQE>rFmEour>#2|Z}XW&kSEzK1MFT9etFAA)nj zj90Dy$jjsFC+7^RXe&NnePJ%hlX!v;`b3C>Bh@E+r|a5)*Mq@CFYSYexME9Gh*n-s zh7`pku}MJf9@~>%dU^uqseJ3;$TIY?hZGoTkZt={Pva!XX!uNIo&A*%T}>&lX_6{` zJb4*UmlD_H=dY9kGa(D&$omYXb*HISc2?Rt_tC7fSGIr!t*zk>xK%}C zW2xqr&NAGI6D%IS+6U#ihQ~#QC3EU^#y7ghu}TD{0Uk#h18#B~)KkVOM<;DSvadL^k@p|PPR zV;25`iw*R_uLO2}Ob~x*_B;F94mGFK6F_6Nk>UESVXOpTY%9j4!6<|}h}8x=y4A0} zmz?v)Jy^A8Q*~~g%*Sle(hBq)$t!8pl%basTeUG%h&S=$~TOGKELY&=7H`!bxXC9eCuH<`0Vf zQarrE2HJdNKLBb?*~iTdSlyvfayk7?qW63#Hf{&}E!Amt<^%Fzj?@ z-w3Sp^HUQW6Kb3BMO)Dmmr)|yZPb<1kPL*7Kb~y>PF#i!srI-P z`sL@nhcZ>=j3tWL2gXtK2G{b5?Yp9kawyT^XnYzSdrka`Qftpo)Qk%(2h{5)1{(A2 zzGbN2B7$GWgZh9|dt4@;t#N?kkhFZ|riR|8CSfljx7Tj4_AkZ7Pg3+Fd3iHr71P6( z+lCZ8nWxf*1WHj&iMz+IjOO*W3G(`jCDVA7oe`L$>2+Ucy#*_Zo20?(E-rps(;R@l zYpk|qNHAcp+@{1?sj(TCwsZeY`E|U+bGw&83=54LZXL=1-5Q_saSZ-@3L7s|_B}GY z7`ib}0Y&bDbpQ@$#Fev5IW6W(&a!Mul4IdM(533-ItVr#rPe#G`shWcX=zrpm*V4B zZWYCRb}D3708B4W*c+vg2@+;fv!Nd`z8NFJg2)hFP}j`g7wfH<9rW@Pb*7I=`9e%; zy_VjAtIwW8LGIQVzyAhlF6un>cl4sGMdq#8u&Sks2Fz6nPWL_KTf+<=DoZds)k4M} zk|;)E`wmnu4QY)Hf?`Q=%%$MvOe!CZPURwP*GzmgIg>GT7Qa&X0^Qm^PMueNg1d7O z+eQgN{?-9*S-!_GAaCgQOv*RJ>3JbCcTs-LY;x0^a>9j&Zg#h=JGgoX$R){W9FMkJr5!IL1u|cFwNSXtTn&hKQ1WQw?D~H;7V~Jkua?#@(aK?Z!Zqg5^ z!n*H1lZTI|=W-lGZvEbUE1Hv!laYK=a9h*Q<>gGOBxL6oKFfDrG}@Ohj({-N*cmfx zhotG0!Gsr$SC|`JnXcN1*p1`W$UcREFx}g8gL4A3(UKpvtCy@@4_MokyFQy<{Tiw5 z+{~uJ2j{&9onZOCr=_C(0}S67+^(g*dyM4*uLf{W2U$}BLLHLXVEJQU?+NyYoonJN zhnf6kdp?JF0Qu+%h@G?~(-7FkQe6^wP0>!$_kw`oi6#3-!UV3RE_{y3j0C!h3x%zZ z1a>Dk*}O*_O%(!a8Wlp`n31 z+e>6OpseykL`dWWcl$y!G7{G>&6L&}C8fum{Npps%_$l%INUD`<|bYu!#MEFClQP) zRGfRd{O6n>7nP$&oMBf351b1GPNX5mi#sK@8{$_St9Ani(L#RO_HSya36}Viuv0UCi-@OBvySXs%5J-$yRlE!SE9_U%;@O)3YS zzC!}G>#7HDbh?mNmnSg~i<(z?gGJQ2;oFN;B{V>x~5ek+t8PRzG5hc89ic$=|(Zj#bu~~A(MY` z*Fp{&$5YigNCSDkI?UPh2pd0G;7`VPRgNAQ=*lC!h8;a!AMsV6y&9pP5!}QeVM_|( zqq?ZFX|mt#mh}`-$<7%eD&;La-H`=y%B^M^-eP+*1c0< zwej-w?Dcrna^ZFV<2!Hr^U;|QnN^ux$7fZipCPBoRZdjSUT)9yPI7>ZJYu)-kYS3( z5Q!}>uE$89{2Z9`90inIQK5{K(+6$gs%jKf`^06kSe>(7)D!D=8^;X)7hW&-X1jYAOEd8KE%?aWV3c;c12q?LFo4jW&Z!Ly5sfK*-T zDx34rCl~#u?Q}IV2`vWD$6gT!!{Am`ycp-~T8!`cQ2@}6LJ9=1?5z^0UxYD6|x#V(D z7XGc(yvJ_CGS=+36!E=_J-F#VLR{USE}u{fbeT3=k|#svnzicZrBH#rlZo;NUv+!* zI~y3g+!Qv)^n~=qtajv=XPlah&4S^82pI%jm%2Sz<34Wm`HO+G4%R7-33oLx`h1Fg zLWd|x`Q3$*Pbfw*IdI6^N>8DCCg6-X&yZbay?vE>TikNIHTH@QCNRW-osla zc4|b8@mcQ&CHso#AcQ`HSc9Xk5$;z2Ltfb~-0bL>LqQX6{;6^)r1T;4d>w1hz%seiM+_ z12v@0Hw)=$e13x2ltnqo$ITPr@N~$ zFEEq)hr7)6<2ajz1VpZaGte`u_kop;=f}q=e*Sl%hoJjR&x^Oq7pwP!4gU7mnH_?5 zUgyM&w`7!x>=qXOla43znCsBMCZf-!<})>0ClhP~9K(Y@9*ljCmL6`6Tx?P8%A6g} zu4|4?CWap|G=>*&PhQO5o@y}Bu(ZBH_9wA$ZjCWxna&7>=%_Ki+dGskRmmYJ6u zAF?tc4$i{vT$rXzLdzE(rz+U3_Lm%KVkmV0_OcV@KiE6*&mw((ayALCMY0TgkPWR^G)`)Kb)Dbetd%V9FdkRV?hYhonf9?k(UsC{maa=-pi3jOWj4%Ty5IGp>_CrngKo(z%= zp-*qZ!n(nFB~nY&GZQ|+*2KPZP7GjewTK;>3L>a8IM8EvLXg;8 z%|kdBC#jkiLh8h}<+mI6GR_&`DIVguMQBVCx?SPW= znCRoD5M30qSm50~F@wn4(B_Py&o*dLtV;BT1KH90GF%=x@LR;9S!#SQ{g55nW}1+3 zyW&QY$+AqQJ^CLRIuQDH<0bh%2}x4v9)eYUMC{XX@*ED_$Bl|g$IKbfWq8dvB-2wd zIlM0qWo<>Ck#*HB0N_XhhCd|l!ZKc!Hlk5Ny4sg=j#IhC7ZaU~X}MA885=Fc z5$BCph|{vG4l=)FUtOBiAFlt5|5^iP9@$Rk(^PbQiR2zTdA&3U*q-KiLCGY&QIh$b zH;Aa~=`0rcInAb1YdX+s|7*9nS7$Axoz6Yn7%~HGS{W)D^H*U%XPWLZk65|NLXMvz z*YJT~?#7(%)!|#w9hsglnV(rsn`OBiPGT}kzAgduz0PMVsmBemJp;h^%k=QQADR>!v?jEW4MnZ?I?wa6$Xv+!GFSH%9NYgmkUopiZA#|o6q6c`>{S#+!$@d119{%DU*xU zaUeV0g16EE(EQM^)PJN{Q4q|GoGgh_f0axMXmK|U_nz9GV53Js5!PS-HM|>@DSYXF zZoaVvgEGwJnNB?~i-$v8X`306MS{L>1ND+T>=PU-OU8A<)dAwC4sxRNHd_Z8^p*m3 zkwUu~Fp9d8IS2jetXFrN&pRX%$M1#zz64kHUM3czwMJx;ak+3@`qQm`ad&9KLsjtj z<(qXU2<(aa57&YL+DT9#A45>S;7PX}*n9C7I(ItaJH=?HgyS9b6H`+b=XVV%?+c)W205s#}Kl-s3t zqMoxKQ+4LW-kU@Sx9zQD#q@eQ>PZSgKfRjg`loY*cegi56dvUEjN4~kdv0OP@xNcH zz5TM_8++To*Ab5Wr$nhO5( zU~dh3|6L03pWEmEDGK;=EB*KNbw)-GPR9Q#6=3{*S^wW$YG-0*`rD0mR(Wn)a7L&T z4;XDi=6$P7BjyT;^9|9;I77fkXy^mp#o*o~%xS#6P%HIxLo847u+|54%CuGtc^@Sa zHKMak^>Nd{E;|y%OgD&5hhHAe`RP3%V!#-ka7ZLOwm_ z$-Gw?%K}yieo4X@f4sEC+TA-54ko)abL0^pxWH%J-0nnwI5_4nwTC|ZwJ$EAKbcXf zv@B7mTLr?PJVEsjd$~ne5 z4ldR|!1}kv3Cs*Ef5XKa%N^Up04L;@?u#)P{t&l&txukC|8~a5G^FA!9`b>L-XW#B zfQQh84ElX)YfG1V&uKAZY_zjZm>y+>aw40$cU9!EIwhjHnyat4hap|_rYJ2eP&zL4 zfJzdp0XCzjF61E5qZg5#r3lg?Lb4lvZO&L7X3W~*ox4qJ$%&N*7mEJhTDJlg&v zk!()Tk;Jw;4+W8y8-pl1@~-04m&h8evR~f>?+_ZWtGfkE#Sd!8c@`a9W$7$2#*h&8 zo0J}8#CM`!EsyB&@a&p#*e}>i55y{a5xWoMx@@jBpf)u zel)+fdOq7v7guPW;D#=GUz&H zj3z!lw9X+!^PQtU^iA&4hb->wOe>dMOZe8ZjdZI?Bfdu6iJhuSNltC_+Dl(OoPvry z4fWk>zK%sFByimdvXCtjec~knI+4cCFORZJVXvJ+)0^%%p-#nm`_dX{Qc)z#Q(tB zf3Io!zgS~u{2OV^^(=A>a+M5ZRQ`K{4UMw=k-JFUgtG)Qu!af|q? zaKUDAB{UnQOdF}I;_8Wr1)uyn^O~8MQ=$leNpVuLBu_=E_gYF#s>5Xwl*+HWK5^14 zTQvMavAUyK@$&Z!b&)qV)iGiYlS4~soU|!R=Y?ld?ucq+De`-i=?6@F2jk;s?t1 z68MnhqNS`L|Ag3Lyy>g(yi3h4?GS*RrsfKmv*9Gt(t1q9C+4#$EF1MtX8gQIx$;bP z@>qz{M($T@ObXXiK(W(ChZT4mu&=~xwR z1|pf8Rc%!K=xC8Y+N`5%QT>D--mFu`^V7>mx)0g^u&*)wE=~M54h2s6zd2M|zQsZq zI2|@nwKhMTn7L%YDrnzX2@OF-cN1pQQx=k<-}OtvZ9!@xw(rI$3wh!5GoCWj@DA&sL~wXcSsh|FE3=uFd>6{Bbh;oxTVGH;!*5LD zQt5#+ZVjM*)mJut)8fx}Hm)B^UR@#95T|j8)&2qDzs*3InK}LjQA9z~wvPd7y*xIwItEliY^n&f~`$lq1vaP(Y$MZf37k?4p^5k1J7 z=3NN9I^JQJG9JuAU}KTw&_g#M7wnzh!4Fz z(90isSC`k(DJck)n?uFB%YJE*bIa9F7TdS7dt*Uja_aQNmLV({TYc!^L%him?Yl$E zDxx8L8(%W)T4x;kT1mbSA;W9K)fZze&e0F@CA4fCwfPEfaho2aJUI0d+JVbJy0trF zd3!)G4(dX|2IP_$$5IhWF&4jA&1)g7N$dKT zCue`>U|#4RTkXDpDR}<%`canFNT$_@TZ8_GqN*=4laQFiD5|;Qw`ZZuN=I9By5+e! zTJ&7R$fL14C0|I~xvB?*G*?nQxhlL)i7rsysi+Pt0Uzm#&%Zn>5M0ehEy*9JW=By` zo8g--cR;le$Jcvk$rz+HyFu1=8&Ru1dw>=laC!fOt^YQGX8U^-GBY*&&PZ53A_tZ|I_(v>>NGfy~QZ$gGAXACfFvJ-UA2L1Q>i$9LzfH-QSpP@j5hEE3 zN(d!3HLtC$Ooqu^lpsrdY*k!HA^B!~&z ze4Z15&3dmM5RQ^Nrs5RzEF4`J_cM3fG1~mWFRs6Rcn+;mhVA*76cf_dGaFj!mvojx z;Fq0!N>^LxyDOWP>o1iJtKtp z$Y#lkybI>wt&+E69IxQf)Mt`le`U;OM-5wsf@g@}8lQ`mg~WxnewMRqTW~)9C}w^8 z{Z_2%JZ-GEQ-2S^-|&|5-2Dfhy!M*D*R-DHyqOo;U2$b?Y5t!7%D6Uj7TEbu+_P8k zpLSgS|6u9AO;wqJFG>Hs8lF|Y#iow|?t~Q_<1+mrfhEeWVtAzk{tGu602}N}ajU*W zlh$#pa&`BvSkN)5^dp~6!3)A|^v)sv5>d0_e4-mB)JQK+ex#aoqFW=l4?Uc8NK?S| zJ=7sJL@oo0PjlY}|CgH23?|l>iqU3e8oD6}JT&NPHPoYJ*py0x%I@53O_1QWHZ_xl zxT&ZOtG<^8!TMsRRTU!!l)qYTp)vi@_Jd_nLjn$b5Dba0$U$}8?v`{_Rq2aAVa$H7)0*RQxy2fltV8*h!Wv?6st0|V#F+&29CXBX)jU1Kq#vd zWQtmo`H6E}>*vDEDAdh#Jg@FtL+a_d{=?eE{BN^fCdU8q@-Nr&NeFm|!wU|(JMMnQ zJ~5I%@@DZlEl-e55IH_oYA8O4YdE%)QWlR-Qa7kIXwOogjg(4+KCY7VeiG)&BV-@- zer+zXMu;WJn9~!MnW`8EZ$^?W)tU;WIcv3t`3c^_9#ka=zeuz0CGrVfBI+*D5DC-u|-uaqnhig0@wLH&VE{?J?BMrhp4Z*jm)|SExOp zuX<1@Zw`!=7u2loL;1SvBfGJfJ(l+=O2`gNKCaOFeB;0gXi%ua%|FEHzs(^z{vM_x z;lLvs1}I^-0v#|g#LWxyt*=Dy!E@URfbwFScSOy$TpyCxoO0EuTqo_he z`e|;Z<#z|4eOJYj+j~eVSw}}3-mwv^f5P=|b2BDpw!h6EX*o$tVIsH{yHKr7@y|pb z$A#vU58hU)dX&zn0x`Y5A|6#MHaGRPHdHYlPsl-O+~OtZ__%hT(7 zvGRb0|5!RYR0G*hzjTkKa{3c`M6f@MxweNYvWIH0O6P>Q*v(lnujl9I#htKszCJq) zU-Who<4*d=gAx+w_B@egUc;4IO~gbKu>{mazcZ8ZkzL6X8r6ZFM?&D68@HgTs&@{9 zQ@;ycB$I`Kuo=L}FR#DvZhtWA5ue8r)NhlHJP=@{xl z=&KVl5;jkNuzf&|`QKPr{%zLA3_NuI+ja zcUBW>{Zom%RKym)ieg8RV2pzLe9=US6$B;5f(0dt3PB~lC@O-$3)tU2XJ&wzVf{t^e``Hw zEy+5bd(S;(x3l-Y=kDw|{l?xq==UF1z8WpGy}iOGn>x5MGH*k8L~&B{dG9r=zAm=* z+qGm{&%bA+msR#0nmffOq4xaIIo!IzllH!5J8nI9anvxQ)zia=(Qf^aYPC#I@Wa}I zKTHL-MgJrECezU@HhTCO<%U&7rCG;vguj$$mp6Xs;W=l~-VV6XSvOXP30Oa*7WejW zA_i>j@}h%@JMGu8b^N;Y5_34{^{5MYWZlr;_2BB;*>^u2dCtgmb8m4QGX53A9GD$fYD}3ho%Ith#@X3qj6E=E%pI8uhcB#8RBclUcI_|L) z2BxjFHY(|Dvo~h;xHH9>>)$!&8cnFSk{%8^VISUSs`=@K_xsd&G$vmfKt}G^zLqv` z<{H}+w^!dz`F=@rP(ToQv(|oEeA;@yO{odX?oTxn9J4)hfc|Fo)*U_Nwd;nw{I1A) z+SRPEdE?$#y2>376mowrIkMr)H&e&Nc;8RlJ579b$dxUmcUe(~+KeN0uurNF#Lbvyf=OFXyd z!4-v_t)N$*skizC_#Bv*Kd7Kbf_-F{#(k9IivG`yCxp{@%7sbZzuc=;^ryNmDv$Av z^ka?byYTYQ-TW1IFYPS$%}q0{oqNOl(kZJuqJH~!ZTlr{ino4uXuRZ%Xpxjuk1-u95QAZN;~tdh$YOvm(ipMR~$Gho0W z=U&$Fg%uv}vtB&rRoyyu>_SsZuyD zgX((J{F-;48D^&*zL;xbGi-NpH~*f(W&32kM$6!XML>q-zz){#tV0Hg*R-r&+8HbG zu00m{o-^sbF1`73&X<2mR@9cJ?n`W5zG9qP!$~`bET_18vy^t}Te3$GKQ?)L)IJFH zyuI#ky~l>cg_nknK0D#fFmk)1A(-E^(Yor33w;MJ>HxmZ`fW@dUFVYSW?{^PBhchk z6M8u$xCd1o3j`-R#4Gc+;8K$`rmee&oZ2m3p=;j!H?t_9S2cLf|3##Ie*wXPrtB>wMm$sTDAH00sp~lN~oVVq1r@|kHn0~Jq{^Cj|nLVa%&(5Pi z-n?5K8b4q}aH=gY^r?9L080L7d9Kqo_hlD`*Y8}cSoHL)Z~vtE{iO+AtvoJ=_MCs( z)+Z>>dH2TYM%5ovieHX>yk~Rcm2A7$c3HLc7gS3D0M7WYiOGR)U33&wJUvUCl z%fw0Wk0?PDN280xQPGe~F-{Bv;3Fd4gX9WGx+f`MlJqdCFg!*iUm%KDd5rQLg+#=88A`=6%2?X>Cq%z3^xGS0+JpJ3ju5ZFXSSG@qjd} zt$-U?Gm&IMMnrltIgh4JAlZsOhzfnOSSphv5&>!GhY?+11G&qo`3_B zu-Pb)BI+_pBny{{B3l` zSsSBhbbm#d9A~&hc`gA>Rk}+RLuZL2e>3X?E^03Qbg$X_ms zor&n#hCw@$(Suq6Ylnx%Lz_c#8I1o#q5WUyVKez82l&U~GDtq?NG_X86HpA22gfBW z9!0X@(-A5Zz=@ut{%kng#5DvxK>z=(&@|84&=(anho(^AOEVdW0DKM zjY+}cJXFA{u>=$i3dyCoBt^j_Ag4Uor#wCY0DA=2=s6n-ghKIPJepI$7eK9QLp4T* z&7+|j0fCT0g$t5~#!`T|Y7XcN>*8xTe`E3ZxKI%GgRTWUfEU`iOco%hT9*UsQm~28 zw`cT>f|?J+LNzY%u@eyk5dqa`eatjOK!5=VN<(W>Fa{Gv101Tcq@k5K=!Stvguq6q zp&AP22U<>5Xq1{~ty8Hk06^6gEWj9sQ3xu491TZepkbG$254y-K=2G4@T&lA3_g;B z*7;E{gcBAfmU|CVi z1d@mL1;K^yVGbl4nu0LrGAQ67z=~v`gCgJqPmo-Iu5Dj5GNGvvQGo9>T%+rD1@l_< z9QA1}NG=dpQ9Z9!$+dU)JU|~Kor|mq5D{MqNznB8DvZPdO7OJ3l>r`OEv;@-SsE64 z!G(?@5;(8A!WIa}R6sj6YWRCRxO_5|vcIrD@B>iV>eaB7g^h*UY1r`M(->G& zZM@a%%1O}2c&y4^bJUn36V6dDtsvpE8lI<}-39B9hb58_XMnGgksE-ouqyz^jp(LL zgKHExN@qM7c7Y0+w&z-gimA$a>;~sc8l&8rx0xOe>_ijO-B_A#t+u2sy|boUI}qCW zLT&4|lbyCkgp(#pU>X3cB2wFP+@R^;E|$yuL{bk)Y&@_D%qVyr9+CwTsXum-kmr#AMN2o5XL;<9iIWvN5f+ zKEb&WPb;;f=7JEVBO5s_cM(5cLZAapLq<@7zi!uihW=V@uzR4!iYxo&8 zJ&B@`#}KPhA6zh0oX*5na0?!-RxyeQxsN3<^y=B*GMm&J*9;pg%Vf-}qSZ1ie?(Pm z$dQ_!MK?};f;*;DatO*ImsfOT5k{;2jQtaqi&1L22w_FkTf}_|JHJzSXsfEK*oxyd z=7jUn6Hm&4J^NMKA{EQvhhDr-SIcz@SKl(@)TNJWUn`Vdh_rj zIbW>YWoWuxjdfzh@mQsCQKIC=5wKYg-BiN3GzJM{{qstLF;&`3EZARTwD|3xwG|bO z&%tC7gRUV>nDP{9`=4DK-gYnQZKwiScRaSDsk>_)-eurbJV6{=R)z2*&JHnbtO(cb z8E=;;yVT2&i$M@Aqc_NQX4g9ywx%cQB?Xmrh&>gcH^BERtmbFbiw#!Kmo*U&%NCt_ z050JK?BWs+PmI4VQg$gyG+3Ol?W*4q{IVHr@M1?SeyPlhr@VcM4;+KtRAOaO)W4*K zzP>~%Q?;X9cc#Dl_z0=N`W*(V+`(j(**)Bwghg<%C&sL0Em9Rk(F$4PfAft=+YJ4s zS3LF0);yIA){}q!D--Z3R3NAKtgXSyAU0P-(rT4rKUMpj0;h>YuKda`q=w3??A#v2 z;sNyLx8PiKL0Y0^&ys@Nkwj5i`nzR+WEiZyQhW69hCH$EpDDYu38Lr-A5{DK{dwpG zIV{DLNIz$=Z@w7F-Pfg|uA80oV-E2*X!LQM$Ajn&bs!r0g0A^s?jcdYS918Y?PMa1zP3{+TA_6?{DiPvEQyCy6u)20S^+J-_a(H|M7Zeuf9s+OBZP5j_hUgE6hup) zzgFB>OiFJoi^_Bs57yP|$7JzP45ik(Oco!)!F1Z#Kvlgq3WdgK zk7aZ9Xb%z4C^AU9ABU+w7D54a>B8g)P@s_ZSRjiozD$ZE(4`-f;-Ls2ow0m9d0|ol zh*{I=$3=l@x^0v`UAO`i)}y@!{2aI*{djB$FVpSEg}7YZHol&mGJ$-0bmp@u{Wcy7 z7t)4>k3zt7+5`*~uB6=$(9nZLz|)sg2)Wgrj|E#xcRr*`^xG)C{RUf5kEU!K1l$Ur zTq+bV5J~ax)K80xlt84RDmZ6`M1s_xDo{tP6oK+kh2aRLa;#2ZFAEs7;ln+BC)557 D=>hG+ literal 0 HcmV?d00001 diff --git a/test/unit_tests/andtree_15/run/test.prs b/test/unit_tests/andtree_15/run/test.prs new file mode 100644 index 0000000..29320ad --- /dev/null +++ b/test/unit_tests/andtree_15/run/test.prs @@ -0,0 +1,139 @@ += "GND" "GND" += "Vdd" "Vdd" += "Reset" "Reset" +"t.at.C2Els[0].a"&"t.at.C2Els[0].b"->"t.at.C2Els[0]._y"- +~("t.at.C2Els[0].a"&"t.at.C2Els[0].b")->"t.at.C2Els[0]._y"+ +"t.at.C2Els[0]._y"->"t.at.C2Els[0].y"- +~("t.at.C2Els[0]._y")->"t.at.C2Els[0].y"+ +"t.at.C2Els[1].a"&"t.at.C2Els[1].b"->"t.at.C2Els[1]._y"- +~("t.at.C2Els[1].a"&"t.at.C2Els[1].b")->"t.at.C2Els[1]._y"+ +"t.at.C2Els[1]._y"->"t.at.C2Els[1].y"- +~("t.at.C2Els[1]._y")->"t.at.C2Els[1].y"+ +"t.at.C2Els[2].a"&"t.at.C2Els[2].b"->"t.at.C2Els[2]._y"- +~("t.at.C2Els[2].a"&"t.at.C2Els[2].b")->"t.at.C2Els[2]._y"+ +"t.at.C2Els[2]._y"->"t.at.C2Els[2].y"- +~("t.at.C2Els[2]._y")->"t.at.C2Els[2].y"+ +"t.at.C2Els[3].a"&"t.at.C2Els[3].b"->"t.at.C2Els[3]._y"- +~("t.at.C2Els[3].a"&"t.at.C2Els[3].b")->"t.at.C2Els[3]._y"+ +"t.at.C2Els[3]._y"->"t.at.C2Els[3].y"- +~("t.at.C2Els[3]._y")->"t.at.C2Els[3].y"+ +"t.at.C2Els[4].a"&"t.at.C2Els[4].b"->"t.at.C2Els[4]._y"- +~("t.at.C2Els[4].a"&"t.at.C2Els[4].b")->"t.at.C2Els[4]._y"+ +"t.at.C2Els[4]._y"->"t.at.C2Els[4].y"- +~("t.at.C2Els[4]._y")->"t.at.C2Els[4].y"+ +"t.at.C2Els[5].a"&"t.at.C2Els[5].b"->"t.at.C2Els[5]._y"- +~("t.at.C2Els[5].a"&"t.at.C2Els[5].b")->"t.at.C2Els[5]._y"+ +"t.at.C2Els[5]._y"->"t.at.C2Els[5].y"- +~("t.at.C2Els[5]._y")->"t.at.C2Els[5].y"+ +"t.at.C2Els[6].a"&"t.at.C2Els[6].b"->"t.at.C2Els[6]._y"- +~("t.at.C2Els[6].a"&"t.at.C2Els[6].b")->"t.at.C2Els[6]._y"+ +"t.at.C2Els[6]._y"->"t.at.C2Els[6].y"- +~("t.at.C2Els[6]._y")->"t.at.C2Els[6].y"+ +"t.at.C2Els[7].a"&"t.at.C2Els[7].b"->"t.at.C2Els[7]._y"- +~("t.at.C2Els[7].a"&"t.at.C2Els[7].b")->"t.at.C2Els[7]._y"+ +"t.at.C2Els[7]._y"->"t.at.C2Els[7].y"- +~("t.at.C2Els[7]._y")->"t.at.C2Els[7].y"+ +"t.at.C3Els[0].a"&"t.at.C3Els[0].b"&"t.at.C3Els[0].c"->"t.at.C3Els[0]._y"- +~("t.at.C3Els[0].a"&"t.at.C3Els[0].b"&"t.at.C3Els[0].c")->"t.at.C3Els[0]._y"+ +"t.at.C3Els[0]._y"->"t.at.C3Els[0].y"- +~("t.at.C3Els[0]._y")->"t.at.C3Els[0].y"+ +"t.at.C3Els[1].a"&"t.at.C3Els[1].b"&"t.at.C3Els[1].c"->"t.at.C3Els[1]._y"- +~("t.at.C3Els[1].a"&"t.at.C3Els[1].b"&"t.at.C3Els[1].c")->"t.at.C3Els[1]._y"+ +"t.at.C3Els[1]._y"->"t.at.C3Els[1].y"- +~("t.at.C3Els[1]._y")->"t.at.C3Els[1].y"+ +"t.at.C3Els[2].a"&"t.at.C3Els[2].b"&"t.at.C3Els[2].c"->"t.at.C3Els[2]._y"- +~("t.at.C3Els[2].a"&"t.at.C3Els[2].b"&"t.at.C3Els[2].c")->"t.at.C3Els[2]._y"+ +"t.at.C3Els[2]._y"->"t.at.C3Els[2].y"- +~("t.at.C3Els[2]._y")->"t.at.C3Els[2].y"+ += "t.at.tmp[15]" "t.at.C2Els[6].a" += "t.at.tmp[15]" "t.at.C2Els[0].y" += "t.at.tmp[16]" "t.at.C2Els[6].b" += "t.at.tmp[16]" "t.at.C2Els[1].y" += "t.at.tmp[17]" "t.at.C2Els[7].a" += "t.at.tmp[17]" "t.at.C2Els[2].y" += "t.at.tmp[18]" "t.at.C2Els[7].b" += "t.at.tmp[18]" "t.at.C2Els[3].y" += "t.at.tmp[19]" "t.at.C3Els[1].a" += "t.at.tmp[19]" "t.at.C2Els[4].y" += "t.at.tmp[20]" "t.at.C3Els[1].b" += "t.at.tmp[20]" "t.at.C2Els[5].y" += "t.at.tmp[21]" "t.at.C3Els[1].c" += "t.at.tmp[21]" "t.at.C3Els[0].y" += "t.at.tmp[22]" "t.at.C3Els[2].a" += "t.at.tmp[22]" "t.at.C2Els[6].y" += "t.at.tmp[23]" "t.at.C3Els[2].b" += "t.at.tmp[23]" "t.at.C2Els[7].y" += "t.at.tmp[24]" "t.at.C3Els[2].c" += "t.at.tmp[24]" "t.at.C3Els[1].y" += "t.at.supply.vdd" "t.at.C3Els[2].vdd" += "t.at.supply.vdd" "t.at.C3Els[1].vdd" += "t.at.supply.vdd" "t.at.C3Els[0].vdd" += "t.at.supply.vdd" "t.at.C2Els[7].vdd" += "t.at.supply.vdd" "t.at.C2Els[6].vdd" += "t.at.supply.vdd" "t.at.C2Els[5].vdd" += "t.at.supply.vdd" "t.at.C2Els[4].vdd" += "t.at.supply.vdd" "t.at.C2Els[3].vdd" += "t.at.supply.vdd" "t.at.C2Els[2].vdd" += "t.at.supply.vdd" "t.at.C2Els[1].vdd" += "t.at.supply.vdd" "t.at.C2Els[0].vdd" += "t.at.supply.vss" "t.at.C3Els[2].vss" += "t.at.supply.vss" "t.at.C3Els[1].vss" += "t.at.supply.vss" "t.at.C3Els[0].vss" += "t.at.supply.vss" "t.at.C2Els[7].vss" += "t.at.supply.vss" "t.at.C2Els[6].vss" += "t.at.supply.vss" "t.at.C2Els[5].vss" += "t.at.supply.vss" "t.at.C2Els[4].vss" += "t.at.supply.vss" "t.at.C2Els[3].vss" += "t.at.supply.vss" "t.at.C2Els[2].vss" += "t.at.supply.vss" "t.at.C2Els[1].vss" += "t.at.supply.vss" "t.at.C2Els[0].vss" += "t.at.in[0]" "t.at.C2Els[0].a" += "t.at.in[0]" "t.at.tmp[0]" += "t.at.in[1]" "t.at.C2Els[0].b" += "t.at.in[1]" "t.at.tmp[1]" += "t.at.in[2]" "t.at.C2Els[1].a" += "t.at.in[2]" "t.at.tmp[2]" += "t.at.in[3]" "t.at.C2Els[1].b" += "t.at.in[3]" "t.at.tmp[3]" += "t.at.in[4]" "t.at.C2Els[2].a" += "t.at.in[4]" "t.at.tmp[4]" += "t.at.in[5]" "t.at.C2Els[2].b" += "t.at.in[5]" "t.at.tmp[5]" += "t.at.in[6]" "t.at.C2Els[3].a" += "t.at.in[6]" "t.at.tmp[6]" += "t.at.in[7]" "t.at.C2Els[3].b" += "t.at.in[7]" "t.at.tmp[7]" += "t.at.in[8]" "t.at.C2Els[4].a" += "t.at.in[8]" "t.at.tmp[8]" += "t.at.in[9]" "t.at.C2Els[4].b" += "t.at.in[9]" "t.at.tmp[9]" += "t.at.in[10]" "t.at.C2Els[5].a" += "t.at.in[10]" "t.at.tmp[10]" += "t.at.in[11]" "t.at.C2Els[5].b" += "t.at.in[11]" "t.at.tmp[11]" += "t.at.in[12]" "t.at.C3Els[0].a" += "t.at.in[12]" "t.at.tmp[12]" += "t.at.in[13]" "t.at.C3Els[0].b" += "t.at.in[13]" "t.at.tmp[13]" += "t.at.in[14]" "t.at.C3Els[0].c" += "t.at.in[14]" "t.at.tmp[14]" += "t.at.out" "t.at.C3Els[2].y" += "t.at.out" "t.at.tmp[25]" += "Vdd" "t.at.supply.vdd" += "GND" "t.at.supply.vss" += "t.out" "t.at.out" += "t.in[0]" "t.at.in[0]" += "t.in[1]" "t.at.in[1]" += "t.in[2]" "t.at.in[2]" += "t.in[3]" "t.at.in[3]" += "t.in[4]" "t.at.in[4]" += "t.in[5]" "t.at.in[5]" += "t.in[6]" "t.at.in[6]" += "t.in[7]" "t.at.in[7]" += "t.in[8]" "t.at.in[8]" += "t.in[9]" "t.at.in[9]" += "t.in[10]" "t.at.in[10]" += "t.in[11]" "t.at.in[11]" += "t.in[12]" "t.at.in[12]" += "t.in[13]" "t.at.in[13]" += "t.in[14]" "t.at.in[14]" diff --git a/test/unit_tests/andtree_15/test.act b/test/unit_tests/andtree_15/test.act new file mode 100644 index 0000000..3cdf438 --- /dev/null +++ b/test/unit_tests/andtree_15/test.act @@ -0,0 +1,41 @@ +/************************************************************************* + * + * This file is part of ACT dataflow neuro library. + * It's the testing facility for cell_lib_std.act + * + * Copyright (c) 2022 University of Groningen - Ole Richter + * Copyright (c) 2022 University of Groningen - Hugh Greatorex + * Copyright (c) 2022 University of Groningen - Michele Mastella + * Copyright (c) 2022 University of Groningen - Madison Cotteret + * + * This source describes Open Hardware and is licensed under the CERN-OHL-W v2 or later + * + * You may redistribute and modify this documentation and make products + * using it under the terms of the CERN-OHL-W v2 (https:/cern.ch/cern-ohl). + * This documentation is distributed WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY + * AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-W v2 + * for applicable conditions. + * + * Source location: https://git.web.rug.nl/bics/actlib_dataflow_neuro + * + * As per CERN-OHL-W v2 section 4.1, should You produce hardware based on + * these sources, You must maintain the Source Location visible in its + * documentation. + * + ************************************************************************** + */ + +import "../../dataflow_neuro/treegates.act"; +import globals; + +open tmpl::dataflow_neuro; + +defproc andtree_15 (bool? in[15]; bool! out){ + andtree<15> at(.in=in, .out=out); + at.supply.vss = GND; + at.supply.vdd = Vdd; + +} + +andtree_15 t; \ No newline at end of file diff --git a/test/unit_tests/andtree_15/test.prsim b/test/unit_tests/andtree_15/test.prsim new file mode 100644 index 0000000..c6c378a --- /dev/null +++ b/test/unit_tests/andtree_15/test.prsim @@ -0,0 +1,110 @@ +watchall + +system "echo '0'" + +set t.in[0] 0 +set t.in[1] 0 +set t.in[2] 0 +set t.in[3] 0 +set t.in[4] 0 +set t.in[5] 0 +set t.in[6] 0 +set t.in[7] 0 +set t.in[8] 0 +set t.in[9] 0 +set t.in[10] 0 +set t.in[11] 0 +set t.in[12] 0 +set t.in[13] 0 +set t.in[14] 0 + +system "echo '1'" + +cycle +mode run + +assert t.out 0 + +system "echo '[] setting some bits high'" +set t.in[0] 1 +set t.in[1] 1 +set t.in[2] 1 +set t.in[3] 1 +set t.in[4] 1 +set t.in[5] 1 +set t.in[6] 1 +set t.in[7] 1 +set t.in[8] 1 +set t.in[9] 1 +set t.in[10] 1 +set t.in[11] 1 +set t.in[12] 0 +set t.in[13] 0 +set t.in[14] 0 + +cycle + +assert t.out 0 + +system "echo '[] setting all bits high'" +set t.in[0] 1 +set t.in[1] 1 +set t.in[2] 1 +set t.in[3] 1 +set t.in[4] 1 +set t.in[5] 1 +set t.in[6] 1 +set t.in[7] 1 +set t.in[8] 1 +set t.in[9] 1 +set t.in[10] 1 +set t.in[11] 1 +set t.in[12] 1 +set t.in[13] 1 +set t.in[14] 1 + +cycle +assert t.out 1 + + +system "echo '[] setting some low'" +set t.in[0] 1 +set t.in[1] 1 +set t.in[2] 1 +set t.in[3] 1 +set t.in[4] 1 +set t.in[5] 1 +set t.in[6] 1 +set t.in[7] 1 +set t.in[8] 1 +set t.in[9] 1 +set t.in[10] 0 +set t.in[11] 1 +set t.in[12] 1 +set t.in[13] 1 +set t.in[14] 1 + +cycle +assert t.out 0 + + +system "echo '[] setting all low'" +set t.in[0] 0 +set t.in[1] 0 +set t.in[2] 0 +set t.in[3] 0 +set t.in[4] 0 +set t.in[5] 0 +set t.in[6] 0 +set t.in[7] 0 +set t.in[8] 0 +set t.in[9] 0 +set t.in[10] 0 +set t.in[11] 0 +set t.in[12] 0 +set t.in[13] 0 +set t.in[14] 0 + +cycle +assert t.out 0 + diff --git a/test/unit_tests/andtree_5/run/prsim.out b/test/unit_tests/andtree_5/run/prsim.out new file mode 100644 index 0000000..feb6ad5 --- /dev/null +++ b/test/unit_tests/andtree_5/run/prsim.out @@ -0,0 +1,40 @@ +t.in[0] t.in[2] t.at.tmp[5] t.in[3] t.at.C2Els[0]._y t.in[4] t.at.C3Els[0]._y t.at.tmp[6] t.in[1] t.out t.at.C2Els[1]._y +0 +1 + 0 t.in[0] : 0 + 0 t.in[4] : 0 + 0 t.in[2] : 0 + 0 t.in[1] : 0 + 0 t.in[3] : 0 + 1 t.at.C2Els[0]._y : 1 [by t.in[0]:=0] + 7092 t.at.C3Els[0]._y : 1 [by t.in[4]:=0] + 7094 t.at.tmp[6] : 0 [by t.at.C3Els[0]._y:=1] + 10468 t.at.tmp[5] : 0 [by t.at.C2Els[0]._y:=1] + 11847 t.at.C2Els[1]._y : 1 [by t.at.tmp[6]:=0] + 12984 t.out : 0 [by t.at.C2Els[1]._y:=1] +[] setting some bits high + 12984 t.in[0] : 1 + 12984 t.in[2] : 1 + 12984 t.in[1] : 1 + 13098 t.at.C2Els[0]._y : 0 [by t.in[1]:=1] + 78464 t.at.tmp[5] : 1 [by t.at.C2Els[0]._y:=0] +[] setting all bits high + 78464 t.in[3] : 1 + 78464 t.in[4] : 1 + 80190 t.at.C3Els[0]._y : 0 [by t.in[4]:=1] + 80229 t.at.tmp[6] : 1 [by t.at.C3Els[0]._y:=0] + 80244 t.at.C2Els[1]._y : 0 [by t.at.tmp[6]:=1] + 80735 t.out : 1 [by t.at.C2Els[1]._y:=0] +[] setting some low + 80735 t.in[0] : 0 + 80735 t.in[1] : 0 + 80748 t.at.C2Els[0]._y : 1 [by t.in[0]:=0] + 80788 t.at.tmp[5] : 0 [by t.at.C2Els[0]._y:=1] + 81203 t.at.C2Els[1]._y : 1 [by t.at.tmp[5]:=0] + 81223 t.out : 0 [by t.at.C2Els[1]._y:=1] +[] setting all low + 81223 t.in[2] : 0 + 81223 t.in[4] : 0 + 81223 t.in[3] : 0 + 87284 t.at.C3Els[0]._y : 1 [by t.in[2]:=0] + 87331 t.at.tmp[6] : 0 [by t.at.C3Els[0]._y:=1] diff --git a/test/unit_tests/andtree_5/run/prsim.pdf b/test/unit_tests/andtree_5/run/prsim.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9bd00a6597bf5c21acdf754170ae085bdf88e16c GIT binary patch literal 17643 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 A!2kdN literal 0 HcmV?d00001 diff --git a/test/unit_tests/andtree_5/run/test.prs b/test/unit_tests/andtree_5/run/test.prs new file mode 100644 index 0000000..bbaf858 --- /dev/null +++ b/test/unit_tests/andtree_5/run/test.prs @@ -0,0 +1,45 @@ += "GND" "GND" += "Vdd" "Vdd" += "Reset" "Reset" +"t.at.C2Els[0].a"&"t.at.C2Els[0].b"->"t.at.C2Els[0]._y"- +~("t.at.C2Els[0].a"&"t.at.C2Els[0].b")->"t.at.C2Els[0]._y"+ +"t.at.C2Els[0]._y"->"t.at.C2Els[0].y"- +~("t.at.C2Els[0]._y")->"t.at.C2Els[0].y"+ +"t.at.C2Els[1].a"&"t.at.C2Els[1].b"->"t.at.C2Els[1]._y"- +~("t.at.C2Els[1].a"&"t.at.C2Els[1].b")->"t.at.C2Els[1]._y"+ +"t.at.C2Els[1]._y"->"t.at.C2Els[1].y"- +~("t.at.C2Els[1]._y")->"t.at.C2Els[1].y"+ +"t.at.C3Els[0].a"&"t.at.C3Els[0].b"&"t.at.C3Els[0].c"->"t.at.C3Els[0]._y"- +~("t.at.C3Els[0].a"&"t.at.C3Els[0].b"&"t.at.C3Els[0].c")->"t.at.C3Els[0]._y"+ +"t.at.C3Els[0]._y"->"t.at.C3Els[0].y"- +~("t.at.C3Els[0]._y")->"t.at.C3Els[0].y"+ += "t.at.tmp[5]" "t.at.C2Els[1].a" += "t.at.tmp[5]" "t.at.C2Els[0].y" += "t.at.tmp[6]" "t.at.C2Els[1].b" += "t.at.tmp[6]" "t.at.C3Els[0].y" += "t.at.supply.vdd" "t.at.C3Els[0].vdd" += "t.at.supply.vdd" "t.at.C2Els[1].vdd" += "t.at.supply.vdd" "t.at.C2Els[0].vdd" += "t.at.supply.vss" "t.at.C3Els[0].vss" += "t.at.supply.vss" "t.at.C2Els[1].vss" += "t.at.supply.vss" "t.at.C2Els[0].vss" += "t.at.in[0]" "t.at.C2Els[0].a" += "t.at.in[0]" "t.at.tmp[0]" += "t.at.in[1]" "t.at.C2Els[0].b" += "t.at.in[1]" "t.at.tmp[1]" += "t.at.in[2]" "t.at.C3Els[0].a" += "t.at.in[2]" "t.at.tmp[2]" += "t.at.in[3]" "t.at.C3Els[0].b" += "t.at.in[3]" "t.at.tmp[3]" += "t.at.in[4]" "t.at.C3Els[0].c" += "t.at.in[4]" "t.at.tmp[4]" += "t.at.out" "t.at.C2Els[1].y" += "t.at.out" "t.at.tmp[7]" += "Vdd" "t.at.supply.vdd" += "GND" "t.at.supply.vss" += "t.out" "t.at.out" += "t.in[0]" "t.at.in[0]" += "t.in[1]" "t.at.in[1]" += "t.in[2]" "t.at.in[2]" += "t.in[3]" "t.at.in[3]" += "t.in[4]" "t.at.in[4]" diff --git a/test/unit_tests/andtree_5/test.act b/test/unit_tests/andtree_5/test.act new file mode 100644 index 0000000..347416a --- /dev/null +++ b/test/unit_tests/andtree_5/test.act @@ -0,0 +1,41 @@ +/************************************************************************* + * + * This file is part of ACT dataflow neuro library. + * It's the testing facility for cell_lib_std.act + * + * Copyright (c) 2022 University of Groningen - Ole Richter + * Copyright (c) 2022 University of Groningen - Hugh Greatorex + * Copyright (c) 2022 University of Groningen - Michele Mastella + * Copyright (c) 2022 University of Groningen - Madison Cotteret + * + * This source describes Open Hardware and is licensed under the CERN-OHL-W v2 or later + * + * You may redistribute and modify this documentation and make products + * using it under the terms of the CERN-OHL-W v2 (https:/cern.ch/cern-ohl). + * This documentation is distributed WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY + * AND FITNESS FOR A PARTICULAR PURPOSE. Please see the CERN-OHL-W v2 + * for applicable conditions. + * + * Source location: https://git.web.rug.nl/bics/actlib_dataflow_neuro + * + * As per CERN-OHL-W v2 section 4.1, should You produce hardware based on + * these sources, You must maintain the Source Location visible in its + * documentation. + * + ************************************************************************** + */ + +import "../../dataflow_neuro/treegates.act"; +import globals; + +open tmpl::dataflow_neuro; + +defproc andtree_5 (bool? in[5]; bool! out){ + andtree<5> at(.in=in, .out=out); + at.supply.vss = GND; + at.supply.vdd = Vdd; + +} + +andtree_5 t; \ No newline at end of file diff --git a/test/unit_tests/andtree_5/test.prsim b/test/unit_tests/andtree_5/test.prsim new file mode 100644 index 0000000..7570c70 --- /dev/null +++ b/test/unit_tests/andtree_5/test.prsim @@ -0,0 +1,50 @@ +watchall + +system "echo '0'" + +set t.in[0] 0 +set t.in[1] 0 +set t.in[2] 0 +set t.in[3] 0 +set t.in[4] 0 + +system "echo '1'" + +cycle +mode run + +assert t.out 0 + +system "echo '[] setting some bits high'" +set t.in[0] 1 +set t.in[1] 1 +set t.in[2] 1 + +cycle + +assert t.out 0 + +system "echo '[] setting all bits high'" +set t.in[3] 1 +set t.in[4] 1 + +cycle +assert t.out 1 + + +system "echo '[] setting some low'" +set t.in[0] 0 +set t.in[1] 0 + +cycle +assert t.out 0 + + +system "echo '[] setting all low'" +set t.in[2] 0 +set t.in[3] 0 +set t.in[4] 0 + +cycle +assert t.out 0 +