From 5bae88d56f00fe03c3827fa06241c9ae33a62cf8 Mon Sep 17 00:00:00 2001 From: alexmadison Date: Mon, 28 Feb 2022 17:56:12 +0100 Subject: [PATCH 1/7] added flag to plot all times --- test/prsim_plot.py | 48 ++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/test/prsim_plot.py b/test/prsim_plot.py index 3064344..0cad3e5 100755 --- a/test/prsim_plot.py +++ b/test/prsim_plot.py @@ -53,6 +53,20 @@ Use -exclude='regex' to specify signals to exclude (or -ex).""") else: raise Exception("Unknown colour given. I cba to code up general colours atm.") + # Check if start time given + for arg in argv: + r = re.findall(r'-t0=(\d+)', arg) + if len(r) >= 1: + print(f"Filtering by start time t0 = {r[0]}") + entries = [e for e in entries if int(e[0]) >= int(r[0])] + + # Check if end time given + for arg in argv: + r = re.findall(r'-t1=(\d+)', arg) + if len(r) >= 1: + print(f"Filtering by start time t0 = {r[0]}") + entries = [e for e in entries if int(e[0]) <= int(r[0])] + # Check if user gave an include filter include_given = False @@ -72,6 +86,18 @@ Use -exclude='regex' to specify signals to exclude (or -ex).""") exclude_given = True exclude_re = r[0][1] + # Check if user gave "keep all times" flag + # This is so you can look at certain signals only + # without them all bunching up. + include_all_times = False + for arg in argv: + r = re.findall(r'(-alltimes?)', arg) + if len(r) >= 1: + include_all_times = True + + # Get list of all times (before filtering) + unique_times = np.unique([int(e[0]) for e in entries]) + assert not (exclude_given and include_given), "Can't give include and exclude re simultaneously." if include_given: print(f"Including signals that match regex {include_re}") if exclude_given: print(f"Excluding signals that match regex {exclude_re}") @@ -82,27 +108,15 @@ Use -exclude='regex' to specify signals to exclude (or -ex).""") if exclude_given: entries = [e for e in entries if re.search(exclude_re, e[1]) == None] - # Check if start time given - for arg in argv: - r = re.findall(r'-t0=(\d+)', arg) - if len(r) >= 1: - print(f"Filtering by start time t0 = {r[0]}") - entries = [e for e in entries if int(e[0]) >= int(r[0])] - - # Check if end time given - for arg in argv: - r = re.findall(r'-t1=(\d+)', arg) - if len(r) >= 1: - print(f"Filtering by start time t0 = {r[0]}") - entries = [e for e in entries if int(e[0]) <= int(r[0])] - assert len(entries) >= 1, "No valid entries in prsim.out!" - # Get list of all sigs and times - times = np.array([int(e[0]) for e in entries]) - unique_times = np.unique(times) num_times = unique_times.shape[0] + # Get list of all times (after filtering) + times = np.array([int(e[0]) for e in entries]) + if not include_all_times: unique_times = np.unique(times) + + # Get list of all sigs sigs = np.array([e[1] for e in entries]) unique_sigs = np.unique(sigs) num_sigs = unique_sigs.shape[0] From 3fc4b1fb1a6c27d5c36665fc083ad82d1220872f Mon Sep 17 00:00:00 2001 From: alexmadison Date: Mon, 28 Feb 2022 18:27:03 +0100 Subject: [PATCH 2/7] buf_s_tempalte init --- dataflow_neuro/primitives.act | 186 ++++++++++++++++++++++------------ 1 file changed, 122 insertions(+), 64 deletions(-) diff --git a/dataflow_neuro/primitives.act b/dataflow_neuro/primitives.act index 00b72e9..6664474 100644 --- a/dataflow_neuro/primitives.act +++ b/dataflow_neuro/primitives.act @@ -149,6 +149,64 @@ namespace tmpl { f_buf_func[i].sr_B = _reset_BXX[i]; ) } + + /** + * Buffer_S template. + * S maybe stands for special. + * Like a buffer, except that the output function block does not load the data in + * until the input data is valid. + * Not entirely sure what the point of it is, + * Ole says is useful for funky timing scenarios. + */ + export template + defproc buffer_s (avMx1of2 in; avMx1of2 out; bool? reset_B; power supply) { + //control + bool _en, _reset_BX,_reset_BXX[N]; + A_3C_RB_X4 inack_ctl(.c1=_en,.c2=in.v,.c3=out.v,.y=in.a,.pr_B=_reset_BX,.sr_B=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); + A_1C1P_X1 en_ctl(.c1=in.a,.p1=out.v,.y=_en,.vdd=supply.vdd,.vss=supply.vss); + + + BUF_X1 reset_buf(.a=reset_B, .y=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); + sigbuf reset_bufarray(.in=_reset_BX, .out=_reset_BXX); + + //validity + bool _in_v, _in_vX[N]; + ctree vc(.in=in.d,.out=_in_v,.supply=supply); + BUF_X4 in_v_buf4(.a=_in_v, .y=in.v,.vdd=supply.vdd,.vss=supply.vss); + sigbuf in_v_bufN(.in = in.v, .out = _in_vX, .supply = supply); + + //function + bool _out_a_BX_t[N],_out_a_BX_f[N],_out_a_B,_en_X_t[N],_en_X_f[N]; + A_2C2N_RB_X4 f_buf_func[N]; + A_2C2N_RB_X4 t_buf_func[N]; + sigbuf en_buf_t(.in=_en, .out=_en_X_t, .supply=supply); + sigbuf en_buf_f(.in=_en, .out=_en_X_f, .supply=supply); + INV_X1 out_a_inv(.a=out.a,.y=_out_a_B); + sigbuf out_a_B_buf_f(.in=_out_a_B,.out=_out_a_BX_t); + sigbuf out_a_B_buf_t(.in=_out_a_B,.out=_out_a_BX_f); + // check if you can also do single var to array connect a=b[N] + // and remove them from the loop + (i:N: + f_buf_func[i].y=out.d.d[i].f; + t_buf_func[i].y=out.d.d[i].t; + f_buf_func[i].c1=_en_X_f[i]; + t_buf_func[i].c1=_en_X_t[i]; + f_buf_func[i].c2=_out_a_BX_f[i]; + t_buf_func[i].c2=_out_a_BX_t[i]; + f_buf_func[i].n1=in.d.d[i].f; + t_buf_func[i].n1=in.d.d[i].t; + f_buf_func[i].n2=_in_vX[i]; + t_buf_func[i].n2=_in_vX[i]; + f_buf_func[i].vdd=supply.vdd; + t_buf_func[i].vdd=supply.vdd; + f_buf_func[i].vss=supply.vss; + t_buf_func[i].vss=supply.vss; + t_buf_func[i].pr_B = _reset_BXX[i]; + t_buf_func[i].sr_B = _reset_BXX[i]; + f_buf_func[i].pr_B = _reset_BXX[i]; + f_buf_func[i].sr_B = _reset_BXX[i]; + ) + } export template defproc demux (avMx1of2 in; avMx1of2 out1; avMx1of2 out2; bool? reset_B; avMx1of2<1> cond; power supply) { @@ -312,81 +370,81 @@ namespace tmpl { } - export template - defproc demux_td (avMx1of2 in; avMx1of2 out1; avMx1of2<1> token; bool? reset_B; avMx1of2<1> cond; power supply) { - //control - bool _en, _reset_BX,_reset_BXX[2*N], _out_v, _in_c_v_; + // export template + // defproc demux_td (avMx1of2 in; avMx1of2 out1; avMx1of2<1> token; bool? reset_B; avMx1of2<1> cond; power supply) { + // //control + // bool _en, _reset_BX,_reset_BXX[2*N], _out_v, _in_c_v_; - OR2_X1 out_or(.a=out1.v, .b=out2.v, .y=_out_v,.vdd=supply.vdd,.vss=supply.vss); - A_3C_RB_X4 inack_ctl(.c1=_en,.c2=_in_c_v_,.c3= _out_v,.y=in.a,.pr_B=_reset_BX,.sr_B=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); - A_1C1P_X1 en_ctl(.c1=in.a,.p1=_out_v,.y=_en,.vdd=supply.vdd,.vss=supply.vss); - BUF_X1 reset_buf(.a=reset_B, .y=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); - sigbuf<2*N> reset_bufarray(.in=_reset_BX, .out=_reset_BXX); - //validity - bool _in_v, _c_f_buf[N], _c_t_buf[N], _c_v; + // OR2_X1 out_or(.a=out1.v, .b=out2.v, .y=_out_v,.vdd=supply.vdd,.vss=supply.vss); + // A_3C_RB_X4 inack_ctl(.c1=_en,.c2=_in_c_v_,.c3= _out_v,.y=in.a,.pr_B=_reset_BX,.sr_B=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); + // A_1C1P_X1 en_ctl(.c1=in.a,.p1=_out_v,.y=_en,.vdd=supply.vdd,.vss=supply.vss); + // BUF_X1 reset_buf(.a=reset_B, .y=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); + // sigbuf<2*N> reset_bufarray(.in=_reset_BX, .out=_reset_BXX); + // //validity + // bool _in_v, _c_f_buf[N], _c_t_buf[N], _c_v; - sigbuf c_buf_t(.in=cond.d.d[0].t, .out=_c_t_buf); - sigbuf c_buf_f(.in=cond.d.d[0].f, .out=_c_f_buf); + // sigbuf c_buf_t(.in=cond.d.d[0].t, .out=_c_t_buf); + // sigbuf c_buf_f(.in=cond.d.d[0].f, .out=_c_f_buf); - //orientation of condition - [ invout < 0 -> - OR2_X1 c_f_c_t_or(.a=cond.d.d[0].t, .b=cond.d.d[0].f, .y=_c_v,.vdd=supply.vdd,.vss=supply.vss); - [] invout > 0 -> - OR2_X1 c_f_c_t_or(.a=cond.d.d[0].f, .b=cond.d.d[0].t, .y=_c_v,.vdd=supply.vdd,.vss=supply.vss); - ] + // //orientation of condition + // [ invout < 0 -> + // OR2_X1 c_f_c_t_or(.a=cond.d.d[0].t, .b=cond.d.d[0].f, .y=_c_v,.vdd=supply.vdd,.vss=supply.vss); + // [] invout > 0 -> + // OR2_X1 c_f_c_t_or(.a=cond.d.d[0].f, .b=cond.d.d[0].t, .y=_c_v,.vdd=supply.vdd,.vss=supply.vss); + // ] - ctree vc(.in=in.d,.out=_in_v,.supply=supply); + // ctree vc(.in=in.d,.out=_in_v,.supply=supply); - A_2C_B_X1 c_el(.c1=_c_v, .c2=_in_v, .y=_in_c_v_,.vdd=supply.vdd,.vss=supply.vss); - BUF_X4 in_v_buf(.a=_in_v, .y=in.v,.vdd=supply.vdd,.vss=supply.vss); + // A_2C_B_X1 c_el(.c1=_c_v, .c2=_in_v, .y=_in_c_v_,.vdd=supply.vdd,.vss=supply.vss); + // BUF_X4 in_v_buf(.a=_in_v, .y=in.v,.vdd=supply.vdd,.vss=supply.vss); - //function - //func buffer out1 - bool _out1_a_BX_t[N],_out1_a_BX_f[N],_out1_a_B,_en1_X_t[N],_en1_X_f[N]; - A_2C2N_RB_X4 out1_f_buf_func[N]; - A_2C2N_RB_X4 out1_t_buf_func[N]; - sigbuf out1_en_buf_t(.in=_en, .out=_en1_X_t, .supply=supply); - sigbuf out1_en_buf_f(.in=_en, .out=_en1_X_f, .supply=supply); - INV_X1 out1_a_inv(.a=out1.a,.y=_out1_a_B); - sigbuf out1_a_B_buf_f(.in=_out1_a_B,.out=_out1_a_BX_t); - sigbuf out1_a_B_buf_t(.in=_out1_a_B,.out=_out1_a_BX_f); - (i:N: - out1_f_buf_func[i].y=out1.d.d[i].f; - out1_t_buf_func[i].y=out1.d.d[i].t; - out1_f_buf_func[i].c1=_en1_X_f[i]; - out1_t_buf_func[i].c1=_en1_X_t[i]; - out1_f_buf_func[i].c2=_out1_a_BX_f[i]; - out1_t_buf_func[i].c2=_out1_a_BX_t[i]; - out1_f_buf_func[i].n1=in.d.d[i].f; - out1_t_buf_func[i].n1=in.d.d[i].t; - out1_f_buf_func[i].vdd=supply.vdd; - out1_t_buf_func[i].vdd=supply.vdd; - out1_f_buf_func[i].vss=supply.vss; - out1_t_buf_func[i].vss=supply.vss; - out1_t_buf_func[i].pr_B = _reset_BXX[i]; - out1_t_buf_func[i].sr_B = _reset_BXX[i]; - out1_f_buf_func[i].pr_B = _reset_BXX[i]; - out1_f_buf_func[i].sr_B = _reset_BXX[i]; - out1_f_buf_func[i].n2=_c_t_buf[i]; - out1_t_buf_func[i].n2=_c_t_buf[i]; - ) + // //function + // //func buffer out1 + // bool _out1_a_BX_t[N],_out1_a_BX_f[N],_out1_a_B,_en1_X_t[N],_en1_X_f[N]; + // A_2C2N_RB_X4 out1_f_buf_func[N]; + // A_2C2N_RB_X4 out1_t_buf_func[N]; + // sigbuf out1_en_buf_t(.in=_en, .out=_en1_X_t, .supply=supply); + // sigbuf out1_en_buf_f(.in=_en, .out=_en1_X_f, .supply=supply); + // INV_X1 out1_a_inv(.a=out1.a,.y=_out1_a_B); + // sigbuf out1_a_B_buf_f(.in=_out1_a_B,.out=_out1_a_BX_t); + // sigbuf out1_a_B_buf_t(.in=_out1_a_B,.out=_out1_a_BX_f); + // (i:N: + // out1_f_buf_func[i].y=out1.d.d[i].f; + // out1_t_buf_func[i].y=out1.d.d[i].t; + // out1_f_buf_func[i].c1=_en1_X_f[i]; + // out1_t_buf_func[i].c1=_en1_X_t[i]; + // out1_f_buf_func[i].c2=_out1_a_BX_f[i]; + // out1_t_buf_func[i].c2=_out1_a_BX_t[i]; + // out1_f_buf_func[i].n1=in.d.d[i].f; + // out1_t_buf_func[i].n1=in.d.d[i].t; + // out1_f_buf_func[i].vdd=supply.vdd; + // out1_t_buf_func[i].vdd=supply.vdd; + // out1_f_buf_func[i].vss=supply.vss; + // out1_t_buf_func[i].vss=supply.vss; + // out1_t_buf_func[i].pr_B = _reset_BXX[i]; + // out1_t_buf_func[i].sr_B = _reset_BXX[i]; + // out1_f_buf_func[i].pr_B = _reset_BXX[i]; + // out1_f_buf_func[i].sr_B = _reset_BXX[i]; + // out1_f_buf_func[i].n2=_c_t_buf[i]; + // out1_t_buf_func[i].n2=_c_t_buf[i]; + // ) - //token out + // //token out - A_2C2N_RB_X4 token_buf; + // A_2C2N_RB_X4 token_buf; - token_buf.y = ; - token_buf.c1 = ; - token_buf.c2 = ; - token_buf.n1 = ; - token_buf.n2 = ; - token_buf.vdd = supply.vdd; - token_buf.vss = supply.vss; - token_buf.pr_B ; - token_buf.sr_b ; - } + // token_buf.y = ; + // token_buf.c1 = ; + // token_buf.c2 = ; + // token_buf.n1 = ; + // token_buf.n2 = ; + // token_buf.vdd = supply.vdd; + // token_buf.vss = supply.vss; + // token_buf.pr_B ; + // token_buf.sr_b ; + // } // export template // defproc merge (avMx1of2 in1; avMx1of2 in2; avMx1of2 out ; bool? reset_B; power supply) { From 84b2831d89a8d0f7ae57c6688ce6687bdacdf548 Mon Sep 17 00:00:00 2001 From: alexmadison Date: Mon, 28 Feb 2022 18:27:22 +0100 Subject: [PATCH 3/7] buf_s_5 unit tests --- test/unit_tests/buf_s_5/run/prsim.out | 157 +++++++ test/unit_tests/buf_s_5/run/prsim.pdf | Bin 0 -> 54472 bytes test/unit_tests/buf_s_5/run/test.prs | 646 ++++++++++++++++++++++++++ test/unit_tests/buf_s_5/test.act | 47 ++ test/unit_tests/buf_s_5/test.prsim | 64 +++ 5 files changed, 914 insertions(+) create mode 100644 test/unit_tests/buf_s_5/run/prsim.out create mode 100644 test/unit_tests/buf_s_5/run/prsim.pdf create mode 100644 test/unit_tests/buf_s_5/run/test.prs create mode 100644 test/unit_tests/buf_s_5/test.act create mode 100644 test/unit_tests/buf_s_5/test.prsim diff --git a/test/unit_tests/buf_s_5/run/prsim.out b/test/unit_tests/buf_s_5/run/prsim.out new file mode 100644 index 0000000..dbae83e --- /dev/null +++ b/test/unit_tests/buf_s_5/run/prsim.out @@ -0,0 +1,157 @@ +b.b.vc.tmp[1] b.b.f_buf_func[3].n1 b.b.vc.C2Els[1]._y b.b._out_a_BX_f[0] b.b.t_buf_func[1].n1 b.b.vc.OR2_tf[1]._y b.b.vc.tmp[0] b.in.v b.b.f_buf_func[1].n1 b.b.t_buf_func[3].n1 b.b._en_X_f[0] b.b._en_X_t[0] b.b._out_a_BX_t[0] b.b._in_vX[0] b.out.v b.b.f_buf_func[0].n1 b.b.f_buf_func[2].n1 b.b.t_buf_func[4].n1 b.b._out_a_B b.b.t_buf_func[2].n1 b.b.vc.OR2_tf[0]._y b.b.t_buf_func[0].n1 b.b.vc.tmp[2] b.b.in_v_bufN.buf2._y b.b.f_buf_func[4].n1 b.b.vc.OR2_tf[2]._y b.b.en_buf_f.buf2._y b.b.vc.tmp[5] b.b.en_buf_t.buf2._y b.b._en b.b.vc.tmp[4] b.b.vc.C3Els[0]._y b.b.vc.OR2_tf[4]._y b.out.a b.b._in_v b.b.vc.tmp[6] b.b.vc.tmp[3] b.b.out_a_B_buf_t.buf2._y b.b.in_v_buf4._y b.b.vc.C2Els[0]._y b.b.out_a_B_buf_f.buf2._y b.b.vc.OR2_tf[3]._y + 84120 b.b.f_buf_func[0].n1 : 0 + 84120 b.b.f_buf_func[4].y : 1 + 84120 b.b.t_buf_func[4].y : 1 + 84120 b.b.f_buf_func[1].n1 : 0 + 84120 b.b.f_buf_func[3].n1 : 0 + 84120 b.b.f_buf_func[3].y : 1 + 84120 b.b.t_buf_func[3].y : 1 + 84120 b.b.f_buf_func[0].y : 1 + 84120 b.b.t_buf_func[0].y : 1 + 84120 b.b.t_buf_func[2].n1 : 0 + 84120 Reset : 0 + 84120 b.b.f_buf_func[2].y : 1 + 84120 b.out.v : 0 + 84120 b.b.t_buf_func[0].n1 : 0 + 84120 b.b.f_buf_func[2].n1 : 0 + 84120 b.out.a : 0 + 84120 b.b.t_buf_func[4].n1 : 0 + 84120 b.b.t_buf_func[1].n1 : 0 + 84120 b.b.f_buf_func[4].n1 : 0 + 84120 b.b.t_buf_func[2].y : 1 + 84120 b.b.t_buf_func[3].n1 : 0 + 84120 b.b.f_buf_func[1].y : 1 + 84120 b.b.t_buf_func[1].y : 1 + 84121 b.b.f_buf_func[2].y : 0 + 84121 b.b._en : 1 [by b.out.v:=0] + 84123 b.b.vc.OR2_tf[1]._y : 1 [by b.b.t_buf_func[1].n1:=0] + 84141 b.b.vc.tmp[1] : 0 [by b.b.vc.OR2_tf[1]._y:=1] + 84402 b.b.vc.OR2_tf[2]._y : 1 [by b.b.f_buf_func[2].n1:=0] + 84542 b.b.t_buf_func[0].y : 0 + 84671 b.b.t_buf_func[2].y : 0 + 84888 b.b._out_a_B : 1 [by b.out.a:=0] + 85074 b.b.f_buf_func[1].y : 0 + 85103 b.b.en_buf_t.buf2._y : 0 [by b.b._en:=1] + 85191 b.b.vc.OR2_tf[3]._y : 1 [by b.b.t_buf_func[3].n1:=0] + 85201 b.b.t_buf_func[1].y : 0 + 88415 b.b.vc.tmp[2] : 0 [by b.b.vc.OR2_tf[2]._y:=1] + 88891 b.b.out_a_B_buf_t.buf2._y : 0 [by b.b._out_a_B:=1] + 89393 b.b._out_a_BX_f[0] : 1 [by b.b.out_a_B_buf_t.buf2._y:=0] + 89951 b.b.vc.tmp[3] : 0 [by b.b.vc.OR2_tf[3]._y:=1] + 97969 b.b.f_buf_func[3].y : 0 + 98463 b.b.f_buf_func[0].y : 0 + 104325 b.b.vc.OR2_tf[0]._y : 1 [by b.b.t_buf_func[0].n1:=0] + 104528 b.b.vc.tmp[0] : 0 [by b.b.vc.OR2_tf[0]._y:=1] + 106382 b.b.vc.C2Els[0]._y : 1 [by b.b.vc.tmp[0]:=0] + 106521 b.b.vc.tmp[5] : 0 [by b.b.vc.C2Els[0]._y:=1] + 106561 b.b.vc.OR2_tf[4]._y : 1 [by b.b.f_buf_func[4].n1:=0] + 106687 b.b._en_X_t[0] : 1 [by b.b.en_buf_t.buf2._y:=0] + 108932 b.b.t_buf_func[3].y : 0 + 113900 b.b.t_buf_func[4].y : 0 + 129789 b.b.out_a_B_buf_f.buf2._y : 0 [by b.b._out_a_B:=1] + 129858 b.b._out_a_BX_t[0] : 1 [by b.b.out_a_B_buf_f.buf2._y:=0] + 132834 b._reset_B : 1 [by Reset:=0] + 132845 b.b.reset_buf._y : 0 [by b._reset_B:=1] + 135773 b.b.f_buf_func[4].y : 0 + 138591 b.b.en_buf_f.buf2._y : 0 [by b.b._en:=1] + 138795 b.b._en_X_f[0] : 1 [by b.b.en_buf_f.buf2._y:=0] + 142907 b.b.vc.tmp[4] : 0 [by b.b.vc.OR2_tf[4]._y:=1] + 142922 b.b.vc.C3Els[0]._y : 1 [by b.b.vc.tmp[4]:=0] + 142923 b.b.vc.tmp[6] : 0 [by b.b.vc.C3Els[0]._y:=1] + 142960 b.b.vc.C2Els[1]._y : 1 [by b.b.vc.tmp[6]:=0] + 143699 b.b._in_v : 0 [by b.b.vc.C2Els[1]._y:=1] + 143811 b.b.in_v_buf4._y : 1 [by b.b._in_v:=0] + 184631 b.b._reset_BX : 1 [by b.b.reset_buf._y:=0] + 184671 b.b.reset_bufarray.buf2._y : 0 [by b.b._reset_BX:=1] + 184928 b.b._reset_BXX[0] : 1 [by b.b.reset_bufarray.buf2._y:=0] + 191323 b.in.v : 0 [by b.b.in_v_buf4._y:=1] + 191410 b.b.in_v_bufN.buf2._y : 1 [by b.in.v:=0] + 191704 b.b._in_vX[0] : 0 [by b.b.in_v_bufN.buf2._y:=1] +[] set Reset 1 + 191704 Reset : 1 + 191705 b._reset_B : 0 [by Reset:=1] + 193511 b.b.reset_buf._y : 1 [by b._reset_B:=0] + 195518 b.b._reset_BX : 0 [by b.b.reset_buf._y:=1] + 196727 b.b.reset_bufarray.buf2._y : 1 [by b.b._reset_BX:=0] + 197317 b.b._reset_BXX[0] : 0 [by b.b.reset_bufarray.buf2._y:=1] +[] set Reset 0 + 197317 Reset : 0 + 197495 b._reset_B : 1 [by Reset:=0] + 198298 b.b.reset_buf._y : 0 [by b._reset_B:=1] + 198462 b.b._reset_BX : 1 [by b.b.reset_buf._y:=0] + 200657 b.b.reset_bufarray.buf2._y : 0 [by b.b._reset_BX:=1] + 200679 b.b._reset_BXX[0] : 1 [by b.b.reset_bufarray.buf2._y:=0] + +[] Reset finished, setting some inputs. + 200679 b.b.t_buf_func[0].n1 : 1 + 200679 b.b.f_buf_func[3].n1 : 1 + 200679 b.b.f_buf_func[2].n1 : 1 + 200679 b.b.t_buf_func[1].n1 : 1 + 200812 b.b.vc.OR2_tf[2]._y : 0 [by b.b.f_buf_func[2].n1:=1] + 201171 b.b.vc.tmp[2] : 1 [by b.b.vc.OR2_tf[2]._y:=0] + 201526 b.b.vc.OR2_tf[0]._y : 0 [by b.b.t_buf_func[0].n1:=1] + 215642 b.b.vc.tmp[0] : 1 [by b.b.vc.OR2_tf[0]._y:=0] + 216341 b.b.vc.OR2_tf[1]._y : 0 [by b.b.t_buf_func[1].n1:=1] + 216562 b.b.vc.tmp[1] : 1 [by b.b.vc.OR2_tf[1]._y:=0] + 216569 b.b.vc.C2Els[0]._y : 0 [by b.b.vc.tmp[1]:=1] + 216599 b.b.vc.tmp[5] : 1 [by b.b.vc.C2Els[0]._y:=0] + 230807 b.b.vc.OR2_tf[3]._y : 0 [by b.b.f_buf_func[3].n1:=1] + 237520 b.b.vc.tmp[3] : 1 [by b.b.vc.OR2_tf[3]._y:=0] +[] Setting final input + 237520 b.b.t_buf_func[4].n1 : 1 + 294981 b.b.vc.OR2_tf[4]._y : 0 [by b.b.t_buf_func[4].n1:=1] + 295072 b.b.vc.tmp[4] : 1 [by b.b.vc.OR2_tf[4]._y:=0] + 297261 b.b.vc.C3Els[0]._y : 0 [by b.b.vc.tmp[4]:=1] + 297268 b.b.vc.tmp[6] : 1 [by b.b.vc.C3Els[0]._y:=0] + 300055 b.b.vc.C2Els[1]._y : 0 [by b.b.vc.tmp[6]:=1] + 300161 b.b._in_v : 1 [by b.b.vc.C2Els[1]._y:=0] + 300239 b.b.in_v_buf4._y : 0 [by b.b._in_v:=1] + 300514 b.in.v : 1 [by b.b.in_v_buf4._y:=0] + 319510 b.b.in_v_bufN.buf2._y : 0 [by b.in.v:=1] + 319965 b.b._in_vX[0] : 1 [by b.b.in_v_bufN.buf2._y:=0] + 319977 b.b.t_buf_func[0]._y : 0 [by b.b._in_vX[0]:=1] + 319977 b.b.t_buf_func[4]._y : 0 [by b.b._in_vX[0]:=1] + 320369 b.b.t_buf_func[1]._y : 0 [by b.b._in_vX[0]:=1] + 320371 b.b.t_buf_func[1].y : 1 [by b.b.t_buf_func[1]._y:=0] + 322876 b.b.t_buf_func[0].y : 1 [by b.b.t_buf_func[0]._y:=0] + 324241 b.b.f_buf_func[3]._y : 0 [by b.b._in_vX[0]:=1] + 324272 b.b.t_buf_func[4].y : 1 [by b.b.t_buf_func[4]._y:=0] + 325881 b.b.f_buf_func[2]._y : 0 [by b.b._in_vX[0]:=1] + 327130 b.b.f_buf_func[2].y : 1 [by b.b.f_buf_func[2]._y:=0] + 328776 b.b.f_buf_func[3].y : 1 [by b.b.f_buf_func[3]._y:=0] +[] Receiving out val + 328776 b.out.v : 1 + 332275 b.b.inack_ctl._y : 0 [by b.out.v:=1] + 332441 b.in.a : 1 [by b.b.inack_ctl._y:=0] + 332516 b.b._en : 0 [by b.in.a:=1] + 332654 b.b.en_buf_t.buf2._y : 1 [by b.b._en:=0] + 332861 b.b.en_buf_f.buf2._y : 1 [by b.b._en:=0] + 332863 b.b._en_X_f[0] : 0 [by b.b.en_buf_f.buf2._y:=1] + 337917 b.b._en_X_t[0] : 0 [by b.b.en_buf_t.buf2._y:=1] +[] Removing input + 337917 b.b.t_buf_func[0].n1 : 0 + 337917 b.b.t_buf_func[4].n1 : 0 + 337917 b.b.f_buf_func[2].n1 : 0 + 337917 b.b.t_buf_func[1].n1 : 0 + 337917 b.b.f_buf_func[3].n1 : 0 + 337918 b.b.vc.OR2_tf[4]._y : 1 [by b.b.t_buf_func[4].n1:=0] + 337928 b.b.vc.OR2_tf[1]._y : 1 [by b.b.t_buf_func[1].n1:=0] + 337985 b.b.vc.tmp[4] : 0 [by b.b.vc.OR2_tf[4]._y:=1] + 338287 b.b.vc.OR2_tf[3]._y : 1 [by b.b.f_buf_func[3].n1:=0] + 338303 b.b.vc.tmp[3] : 0 [by b.b.vc.OR2_tf[3]._y:=1] + 338465 b.b.vc.OR2_tf[2]._y : 1 [by b.b.f_buf_func[2].n1:=0] + 340569 b.b.vc.tmp[1] : 0 [by b.b.vc.OR2_tf[1]._y:=1] + 343027 b.b.vc.tmp[2] : 0 [by b.b.vc.OR2_tf[2]._y:=1] + 343555 b.b.vc.C3Els[0]._y : 1 [by b.b.vc.tmp[2]:=0] + 345990 b.b.vc.tmp[6] : 0 [by b.b.vc.C3Els[0]._y:=1] + 381834 b.b.vc.OR2_tf[0]._y : 1 [by b.b.t_buf_func[0].n1:=0] + 408714 b.b.vc.tmp[0] : 0 [by b.b.vc.OR2_tf[0]._y:=1] + 432639 b.b.vc.C2Els[0]._y : 1 [by b.b.vc.tmp[0]:=0] + 445680 b.b.vc.tmp[5] : 0 [by b.b.vc.C2Els[0]._y:=1] + 445682 b.b.vc.C2Els[1]._y : 1 [by b.b.vc.tmp[5]:=0] + 506640 b.b._in_v : 0 [by b.b.vc.C2Els[1]._y:=1] + 506643 b.b.in_v_buf4._y : 1 [by b.b._in_v:=0] + 506672 b.in.v : 0 [by b.b.in_v_buf4._y:=1] + 506989 b.b.in_v_bufN.buf2._y : 1 [by b.in.v:=0] + 508590 b.b._in_vX[0] : 0 [by b.b.in_v_bufN.buf2._y:=1] +[] Receiving out ack diff --git a/test/unit_tests/buf_s_5/run/prsim.pdf b/test/unit_tests/buf_s_5/run/prsim.pdf new file mode 100644 index 0000000000000000000000000000000000000000..898f10abd33b01b5d7e0d8dafb6bf316cb8c9ebc GIT binary patch literal 54472 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%0AB;= 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"b._reset_B"- +~("Reset")->"b._reset_B"+ +"b.b.out_a_B_buf_t.buf2.a"->"b.b.out_a_B_buf_t.buf2._y"- +~("b.b.out_a_B_buf_t.buf2.a")->"b.b.out_a_B_buf_t.buf2._y"+ +"b.b.out_a_B_buf_t.buf2._y"->"b.b.out_a_B_buf_t.buf2.y"- +~("b.b.out_a_B_buf_t.buf2._y")->"b.b.out_a_B_buf_t.buf2.y"+ += "b.b.out_a_B_buf_t.supply.vdd" "b.b.out_a_B_buf_t.buf2.vdd" += "b.b.out_a_B_buf_t.supply.vss" "b.b.out_a_B_buf_t.buf2.vss" += "b.b.out_a_B_buf_t.out[0]" "b.b.out_a_B_buf_t.out[4]" += "b.b.out_a_B_buf_t.out[0]" "b.b.out_a_B_buf_t.out[3]" += "b.b.out_a_B_buf_t.out[0]" "b.b.out_a_B_buf_t.out[2]" += "b.b.out_a_B_buf_t.out[0]" "b.b.out_a_B_buf_t.out[1]" += "b.b.out_a_B_buf_t.out[0]" "b.b.out_a_B_buf_t.buf2.y" += "b.b.out_a_B_buf_t.in" "b.b.out_a_B_buf_t.buf2.a" += "b.b._en_X_f[0]" "b.b.en_buf_f.out[0]" += "b.b._en_X_f[1]" "b.b.en_buf_f.out[1]" += "b.b._en_X_f[2]" "b.b.en_buf_f.out[2]" += "b.b._en_X_f[3]" "b.b.en_buf_f.out[3]" += "b.b._en_X_f[4]" "b.b.en_buf_f.out[4]" += "b.b._en_X_f[0]" "b.b.f_buf_func[4].c1" += "b.b._en_X_f[0]" "b.b.f_buf_func[3].c1" += "b.b._en_X_f[0]" "b.b.f_buf_func[2].c1" += "b.b._en_X_f[0]" "b.b.f_buf_func[1].c1" += "b.b._en_X_f[0]" "b.b.f_buf_func[0].c1" += "b.b._en_X_f[0]" "b.b._en_X_f[4]" += "b.b._en_X_f[0]" "b.b._en_X_f[3]" += "b.b._en_X_f[0]" "b.b._en_X_f[2]" += "b.b._en_X_f[0]" "b.b._en_X_f[1]" +~"b.b.inack_ctl.c1"&~"b.b.inack_ctl.c2"&~"b.b.inack_ctl.c3"|~"b.b.inack_ctl.pr_B"->"b.b.inack_ctl._y"+ +"b.b.inack_ctl.c1"&"b.b.inack_ctl.c2"&"b.b.inack_ctl.c3"&"b.b.inack_ctl.sr_B"->"b.b.inack_ctl._y"- +"b.b.inack_ctl._y"->"b.b.inack_ctl.y"- +~("b.b.inack_ctl._y")->"b.b.inack_ctl.y"+ +"b.b.reset_bufarray.buf2.a"->"b.b.reset_bufarray.buf2._y"- +~("b.b.reset_bufarray.buf2.a")->"b.b.reset_bufarray.buf2._y"+ +"b.b.reset_bufarray.buf2._y"->"b.b.reset_bufarray.buf2.y"- +~("b.b.reset_bufarray.buf2._y")->"b.b.reset_bufarray.buf2.y"+ += "b.b.reset_bufarray.supply.vdd" "b.b.reset_bufarray.buf2.vdd" += "b.b.reset_bufarray.supply.vss" "b.b.reset_bufarray.buf2.vss" += "b.b.reset_bufarray.out[0]" "b.b.reset_bufarray.out[4]" += "b.b.reset_bufarray.out[0]" "b.b.reset_bufarray.out[3]" += "b.b.reset_bufarray.out[0]" "b.b.reset_bufarray.out[2]" += "b.b.reset_bufarray.out[0]" "b.b.reset_bufarray.out[1]" += "b.b.reset_bufarray.out[0]" "b.b.reset_bufarray.buf2.y" += "b.b.reset_bufarray.in" "b.b.reset_bufarray.buf2.a" +"b.b.in_v_buf4.a"->"b.b.in_v_buf4._y"- +~("b.b.in_v_buf4.a")->"b.b.in_v_buf4._y"+ +"b.b.in_v_buf4._y"->"b.b.in_v_buf4.y"- +~("b.b.in_v_buf4._y")->"b.b.in_v_buf4.y"+ +"b.b.out_a_inv.a"->"b.b.out_a_inv.y"- +~("b.b.out_a_inv.a")->"b.b.out_a_inv.y"+ += "b.b._out_a_BX_f[0]" "b.b.out_a_B_buf_t.out[0]" += "b.b._out_a_BX_f[1]" "b.b.out_a_B_buf_t.out[1]" += "b.b._out_a_BX_f[2]" "b.b.out_a_B_buf_t.out[2]" += "b.b._out_a_BX_f[3]" "b.b.out_a_B_buf_t.out[3]" += "b.b._out_a_BX_f[4]" "b.b.out_a_B_buf_t.out[4]" += "b.b._out_a_BX_f[0]" "b.b.f_buf_func[4].c2" += "b.b._out_a_BX_f[0]" "b.b.f_buf_func[3].c2" += "b.b._out_a_BX_f[0]" "b.b.f_buf_func[2].c2" += "b.b._out_a_BX_f[0]" "b.b.f_buf_func[1].c2" += "b.b._out_a_BX_f[0]" "b.b.f_buf_func[0].c2" += "b.b._out_a_BX_f[0]" "b.b._out_a_BX_f[4]" += "b.b._out_a_BX_f[0]" "b.b._out_a_BX_f[3]" += "b.b._out_a_BX_f[0]" "b.b._out_a_BX_f[2]" += "b.b._out_a_BX_f[0]" "b.b._out_a_BX_f[1]" += "b.b.supply.vss" "b.b.en_buf_f.supply.vss" += "b.b.supply.vdd" "b.b.en_buf_f.supply.vdd" += "b.b.supply.vss" "b.b.en_buf_t.supply.vss" += "b.b.supply.vdd" "b.b.en_buf_t.supply.vdd" += "b.b.supply.vss" "b.b.in_v_bufN.supply.vss" += "b.b.supply.vdd" "b.b.in_v_bufN.supply.vdd" += "b.b.supply.vss" "b.b.vc.supply.vss" += "b.b.supply.vdd" "b.b.vc.supply.vdd" += "b.b.supply.vdd" "b.b.t_buf_func[4].vdd" += "b.b.supply.vdd" "b.b.f_buf_func[4].vdd" += "b.b.supply.vdd" "b.b.t_buf_func[3].vdd" += "b.b.supply.vdd" "b.b.f_buf_func[3].vdd" += "b.b.supply.vdd" "b.b.t_buf_func[2].vdd" += "b.b.supply.vdd" "b.b.f_buf_func[2].vdd" += "b.b.supply.vdd" "b.b.t_buf_func[1].vdd" += "b.b.supply.vdd" "b.b.f_buf_func[1].vdd" += "b.b.supply.vdd" "b.b.t_buf_func[0].vdd" += "b.b.supply.vdd" "b.b.f_buf_func[0].vdd" += "b.b.supply.vdd" "b.b.in_v_buf4.vdd" += "b.b.supply.vdd" "b.b.reset_buf.vdd" += "b.b.supply.vdd" "b.b.en_ctl.vdd" += "b.b.supply.vdd" "b.b.inack_ctl.vdd" += "b.b.supply.vss" "b.b.t_buf_func[4].vss" += "b.b.supply.vss" "b.b.f_buf_func[4].vss" += "b.b.supply.vss" "b.b.t_buf_func[3].vss" += "b.b.supply.vss" "b.b.f_buf_func[3].vss" += "b.b.supply.vss" "b.b.t_buf_func[2].vss" += "b.b.supply.vss" "b.b.f_buf_func[2].vss" += "b.b.supply.vss" "b.b.t_buf_func[1].vss" += "b.b.supply.vss" "b.b.f_buf_func[1].vss" += "b.b.supply.vss" "b.b.t_buf_func[0].vss" += "b.b.supply.vss" "b.b.f_buf_func[0].vss" += "b.b.supply.vss" "b.b.in_v_buf4.vss" += "b.b.supply.vss" "b.b.reset_buf.vss" += "b.b.supply.vss" "b.b.en_ctl.vss" += "b.b.supply.vss" "b.b.inack_ctl.vss" +~"b.b.vc.C2Els[0].c1"&~"b.b.vc.C2Els[0].c2"->"b.b.vc.C2Els[0]._y"+ +"b.b.vc.C2Els[0].c1"&"b.b.vc.C2Els[0].c2"->"b.b.vc.C2Els[0]._y"- +"b.b.vc.C2Els[0]._y"->"b.b.vc.C2Els[0].y"- +~("b.b.vc.C2Els[0]._y")->"b.b.vc.C2Els[0].y"+ +~"b.b.vc.C2Els[1].c1"&~"b.b.vc.C2Els[1].c2"->"b.b.vc.C2Els[1]._y"+ +"b.b.vc.C2Els[1].c1"&"b.b.vc.C2Els[1].c2"->"b.b.vc.C2Els[1]._y"- +"b.b.vc.C2Els[1]._y"->"b.b.vc.C2Els[1].y"- +~("b.b.vc.C2Els[1]._y")->"b.b.vc.C2Els[1].y"+ +~"b.b.vc.C3Els[0].c1"&~"b.b.vc.C3Els[0].c2"&~"b.b.vc.C3Els[0].c3"->"b.b.vc.C3Els[0]._y"+ +"b.b.vc.C3Els[0].c1"&"b.b.vc.C3Els[0].c2"&"b.b.vc.C3Els[0].c3"->"b.b.vc.C3Els[0]._y"- +"b.b.vc.C3Els[0]._y"->"b.b.vc.C3Els[0].y"- +~("b.b.vc.C3Els[0]._y")->"b.b.vc.C3Els[0].y"+ +"b.b.vc.OR2_tf[0].a"|"b.b.vc.OR2_tf[0].b"->"b.b.vc.OR2_tf[0]._y"- +~("b.b.vc.OR2_tf[0].a"|"b.b.vc.OR2_tf[0].b")->"b.b.vc.OR2_tf[0]._y"+ +"b.b.vc.OR2_tf[0]._y"->"b.b.vc.OR2_tf[0].y"- +~("b.b.vc.OR2_tf[0]._y")->"b.b.vc.OR2_tf[0].y"+ +"b.b.vc.OR2_tf[1].a"|"b.b.vc.OR2_tf[1].b"->"b.b.vc.OR2_tf[1]._y"- +~("b.b.vc.OR2_tf[1].a"|"b.b.vc.OR2_tf[1].b")->"b.b.vc.OR2_tf[1]._y"+ +"b.b.vc.OR2_tf[1]._y"->"b.b.vc.OR2_tf[1].y"- +~("b.b.vc.OR2_tf[1]._y")->"b.b.vc.OR2_tf[1].y"+ +"b.b.vc.OR2_tf[2].a"|"b.b.vc.OR2_tf[2].b"->"b.b.vc.OR2_tf[2]._y"- +~("b.b.vc.OR2_tf[2].a"|"b.b.vc.OR2_tf[2].b")->"b.b.vc.OR2_tf[2]._y"+ +"b.b.vc.OR2_tf[2]._y"->"b.b.vc.OR2_tf[2].y"- +~("b.b.vc.OR2_tf[2]._y")->"b.b.vc.OR2_tf[2].y"+ +"b.b.vc.OR2_tf[3].a"|"b.b.vc.OR2_tf[3].b"->"b.b.vc.OR2_tf[3]._y"- +~("b.b.vc.OR2_tf[3].a"|"b.b.vc.OR2_tf[3].b")->"b.b.vc.OR2_tf[3]._y"+ +"b.b.vc.OR2_tf[3]._y"->"b.b.vc.OR2_tf[3].y"- +~("b.b.vc.OR2_tf[3]._y")->"b.b.vc.OR2_tf[3].y"+ +"b.b.vc.OR2_tf[4].a"|"b.b.vc.OR2_tf[4].b"->"b.b.vc.OR2_tf[4]._y"- +~("b.b.vc.OR2_tf[4].a"|"b.b.vc.OR2_tf[4].b")->"b.b.vc.OR2_tf[4]._y"+ +"b.b.vc.OR2_tf[4]._y"->"b.b.vc.OR2_tf[4].y"- +~("b.b.vc.OR2_tf[4]._y")->"b.b.vc.OR2_tf[4].y"+ += "b.b.vc.tmp[0]" "b.b.vc.C2Els[0].c1" += "b.b.vc.tmp[0]" "b.b.vc.OR2_tf[0].y" += "b.b.vc.tmp[1]" "b.b.vc.C2Els[0].c2" += "b.b.vc.tmp[1]" "b.b.vc.OR2_tf[1].y" += "b.b.vc.tmp[2]" "b.b.vc.C3Els[0].c1" += "b.b.vc.tmp[2]" "b.b.vc.OR2_tf[2].y" += "b.b.vc.tmp[3]" "b.b.vc.C3Els[0].c2" += "b.b.vc.tmp[3]" "b.b.vc.OR2_tf[3].y" += "b.b.vc.tmp[4]" "b.b.vc.C3Els[0].c3" += "b.b.vc.tmp[4]" "b.b.vc.OR2_tf[4].y" += "b.b.vc.tmp[5]" "b.b.vc.C2Els[1].c1" += "b.b.vc.tmp[5]" "b.b.vc.C2Els[0].y" += "b.b.vc.tmp[6]" "b.b.vc.C2Els[1].c2" += "b.b.vc.tmp[6]" "b.b.vc.C3Els[0].y" += "b.b.vc.supply.vdd" "b.b.vc.C3Els[0].vdd" += "b.b.vc.supply.vdd" "b.b.vc.C2Els[1].vdd" += "b.b.vc.supply.vdd" "b.b.vc.C2Els[0].vdd" += "b.b.vc.supply.vdd" "b.b.vc.OR2_tf[4].vdd" += "b.b.vc.supply.vdd" "b.b.vc.OR2_tf[3].vdd" += "b.b.vc.supply.vdd" "b.b.vc.OR2_tf[2].vdd" += "b.b.vc.supply.vdd" "b.b.vc.OR2_tf[1].vdd" += "b.b.vc.supply.vdd" "b.b.vc.OR2_tf[0].vdd" += "b.b.vc.supply.vss" "b.b.vc.C3Els[0].vss" += "b.b.vc.supply.vss" "b.b.vc.C2Els[1].vss" += "b.b.vc.supply.vss" "b.b.vc.C2Els[0].vss" += "b.b.vc.supply.vss" "b.b.vc.OR2_tf[4].vss" += "b.b.vc.supply.vss" "b.b.vc.OR2_tf[3].vss" += "b.b.vc.supply.vss" "b.b.vc.OR2_tf[2].vss" += "b.b.vc.supply.vss" "b.b.vc.OR2_tf[1].vss" += "b.b.vc.supply.vss" "b.b.vc.OR2_tf[0].vss" += "b.b.vc.in.d[0].d[0]" "b.b.vc.in.d[0].f" += "b.b.vc.in.d[0].d[1]" "b.b.vc.in.d[0].t" += "b.b.vc.in.d[1].d[0]" "b.b.vc.in.d[1].f" += "b.b.vc.in.d[1].d[1]" "b.b.vc.in.d[1].t" += "b.b.vc.in.d[2].d[0]" "b.b.vc.in.d[2].f" += "b.b.vc.in.d[2].d[1]" "b.b.vc.in.d[2].t" += "b.b.vc.in.d[3].d[0]" "b.b.vc.in.d[3].f" += "b.b.vc.in.d[3].d[1]" "b.b.vc.in.d[3].t" += "b.b.vc.in.d[4].d[0]" "b.b.vc.in.d[4].f" += "b.b.vc.in.d[4].d[1]" "b.b.vc.in.d[4].t" += "b.b.vc.in.d[4].d[0]" "b.b.vc.in.d[4].f" += "b.b.vc.in.d[4].d[1]" "b.b.vc.in.d[4].t" += "b.b.vc.in.d[3].d[0]" "b.b.vc.in.d[3].f" += "b.b.vc.in.d[3].d[1]" "b.b.vc.in.d[3].t" += "b.b.vc.in.d[2].d[0]" "b.b.vc.in.d[2].f" += "b.b.vc.in.d[2].d[1]" "b.b.vc.in.d[2].t" += "b.b.vc.in.d[1].d[0]" "b.b.vc.in.d[1].f" += "b.b.vc.in.d[1].d[1]" "b.b.vc.in.d[1].t" += "b.b.vc.in.d[0].d[0]" "b.b.vc.in.d[0].f" += "b.b.vc.in.d[0].d[1]" "b.b.vc.in.d[0].t" += "b.b.vc.in.d[4].d[0]" "b.b.vc.OR2_tf[4].b" += "b.b.vc.in.d[4].d[0]" "b.b.vc.in.d[4].f" += "b.b.vc.in.d[4].d[1]" "b.b.vc.OR2_tf[4].a" += "b.b.vc.in.d[4].d[1]" "b.b.vc.in.d[4].t" += "b.b.vc.in.d[3].d[0]" "b.b.vc.OR2_tf[3].b" += "b.b.vc.in.d[3].d[0]" "b.b.vc.in.d[3].f" += "b.b.vc.in.d[3].d[1]" "b.b.vc.OR2_tf[3].a" += "b.b.vc.in.d[3].d[1]" "b.b.vc.in.d[3].t" += "b.b.vc.in.d[2].d[0]" "b.b.vc.OR2_tf[2].b" += "b.b.vc.in.d[2].d[0]" "b.b.vc.in.d[2].f" += "b.b.vc.in.d[2].d[1]" "b.b.vc.OR2_tf[2].a" += "b.b.vc.in.d[2].d[1]" "b.b.vc.in.d[2].t" += "b.b.vc.in.d[1].d[0]" "b.b.vc.OR2_tf[1].b" += "b.b.vc.in.d[1].d[0]" "b.b.vc.in.d[1].f" += "b.b.vc.in.d[1].d[1]" "b.b.vc.OR2_tf[1].a" += "b.b.vc.in.d[1].d[1]" "b.b.vc.in.d[1].t" += "b.b.vc.in.d[0].d[0]" "b.b.vc.OR2_tf[0].b" += "b.b.vc.in.d[0].d[0]" "b.b.vc.in.d[0].f" += "b.b.vc.in.d[0].d[1]" "b.b.vc.OR2_tf[0].a" += "b.b.vc.in.d[0].d[1]" "b.b.vc.in.d[0].t" += "b.b.vc.out" "b.b.vc.C2Els[1].y" += "b.b.vc.out" "b.b.vc.tmp[7]" +"b.b.out_a_B_buf_f.buf2.a"->"b.b.out_a_B_buf_f.buf2._y"- +~("b.b.out_a_B_buf_f.buf2.a")->"b.b.out_a_B_buf_f.buf2._y"+ +"b.b.out_a_B_buf_f.buf2._y"->"b.b.out_a_B_buf_f.buf2.y"- +~("b.b.out_a_B_buf_f.buf2._y")->"b.b.out_a_B_buf_f.buf2.y"+ += "b.b.out_a_B_buf_f.supply.vdd" "b.b.out_a_B_buf_f.buf2.vdd" += "b.b.out_a_B_buf_f.supply.vss" "b.b.out_a_B_buf_f.buf2.vss" += "b.b.out_a_B_buf_f.out[0]" "b.b.out_a_B_buf_f.out[4]" += "b.b.out_a_B_buf_f.out[0]" "b.b.out_a_B_buf_f.out[3]" += "b.b.out_a_B_buf_f.out[0]" "b.b.out_a_B_buf_f.out[2]" += "b.b.out_a_B_buf_f.out[0]" "b.b.out_a_B_buf_f.out[1]" += "b.b.out_a_B_buf_f.out[0]" "b.b.out_a_B_buf_f.buf2.y" += "b.b.out_a_B_buf_f.in" "b.b.out_a_B_buf_f.buf2.a" += "b.b._en" "b.b.en_buf_f.in" += "b.b._en" "b.b.en_buf_t.in" += "b.b._en" "b.b.en_ctl.y" += "b.b._en" "b.b.inack_ctl.c1" +~"b.b.en_ctl.p1"&~"b.b.en_ctl.c1"->"b.b.en_ctl.y"+ +"b.b.en_ctl.c1"->"b.b.en_ctl.y"- += "b.b.out.d.d[0].d[0]" "b.b.out.d.d[0].f" += "b.b.out.d.d[0].d[1]" "b.b.out.d.d[0].t" += "b.b.out.d.d[1].d[0]" "b.b.out.d.d[1].f" += "b.b.out.d.d[1].d[1]" "b.b.out.d.d[1].t" += "b.b.out.d.d[2].d[0]" "b.b.out.d.d[2].f" += "b.b.out.d.d[2].d[1]" "b.b.out.d.d[2].t" += "b.b.out.d.d[3].d[0]" "b.b.out.d.d[3].f" += "b.b.out.d.d[3].d[1]" "b.b.out.d.d[3].t" += "b.b.out.d.d[4].d[0]" "b.b.out.d.d[4].f" += "b.b.out.d.d[4].d[1]" "b.b.out.d.d[4].t" += "b.b.out.d.d[4].d[0]" "b.b.out.d.d[4].f" += "b.b.out.d.d[4].d[1]" "b.b.out.d.d[4].t" += "b.b.out.d.d[3].d[0]" "b.b.out.d.d[3].f" += "b.b.out.d.d[3].d[1]" "b.b.out.d.d[3].t" += "b.b.out.d.d[2].d[0]" "b.b.out.d.d[2].f" += "b.b.out.d.d[2].d[1]" "b.b.out.d.d[2].t" += "b.b.out.d.d[1].d[0]" "b.b.out.d.d[1].f" += "b.b.out.d.d[1].d[1]" "b.b.out.d.d[1].t" += "b.b.out.d.d[0].d[0]" "b.b.out.d.d[0].f" += "b.b.out.d.d[0].d[1]" "b.b.out.d.d[0].t" += "b.b.out.d.d[4].d[0]" "b.b.out.d.d[4].f" += "b.b.out.d.d[4].d[1]" "b.b.out.d.d[4].t" += "b.b.out.d.d[3].d[0]" "b.b.out.d.d[3].f" += "b.b.out.d.d[3].d[1]" "b.b.out.d.d[3].t" += "b.b.out.d.d[2].d[0]" "b.b.out.d.d[2].f" += "b.b.out.d.d[2].d[1]" "b.b.out.d.d[2].t" += "b.b.out.d.d[1].d[0]" "b.b.out.d.d[1].f" += "b.b.out.d.d[1].d[1]" "b.b.out.d.d[1].t" += "b.b.out.d.d[0].d[0]" "b.b.out.d.d[0].f" += "b.b.out.d.d[0].d[1]" "b.b.out.d.d[0].t" += "b.b.out.a" "b.b.out_a_inv.a" += "b.b.out.v" "b.b.en_ctl.p1" += "b.b.out.v" "b.b.inack_ctl.c3" += "b.b.out.d.d[4].d[0]" "b.b.f_buf_func[4].y" += "b.b.out.d.d[4].d[0]" "b.b.out.d.d[4].f" += "b.b.out.d.d[4].d[1]" "b.b.t_buf_func[4].y" += "b.b.out.d.d[4].d[1]" "b.b.out.d.d[4].t" += "b.b.out.d.d[3].d[0]" "b.b.f_buf_func[3].y" += "b.b.out.d.d[3].d[0]" "b.b.out.d.d[3].f" += "b.b.out.d.d[3].d[1]" "b.b.t_buf_func[3].y" += "b.b.out.d.d[3].d[1]" "b.b.out.d.d[3].t" += "b.b.out.d.d[2].d[0]" "b.b.f_buf_func[2].y" += "b.b.out.d.d[2].d[0]" "b.b.out.d.d[2].f" += "b.b.out.d.d[2].d[1]" "b.b.t_buf_func[2].y" += "b.b.out.d.d[2].d[1]" "b.b.out.d.d[2].t" += "b.b.out.d.d[1].d[0]" "b.b.f_buf_func[1].y" += "b.b.out.d.d[1].d[0]" "b.b.out.d.d[1].f" += "b.b.out.d.d[1].d[1]" "b.b.t_buf_func[1].y" += "b.b.out.d.d[1].d[1]" "b.b.out.d.d[1].t" += "b.b.out.d.d[0].d[0]" "b.b.f_buf_func[0].y" += "b.b.out.d.d[0].d[0]" "b.b.out.d.d[0].f" += "b.b.out.d.d[0].d[1]" "b.b.t_buf_func[0].y" += "b.b.out.d.d[0].d[1]" "b.b.out.d.d[0].t" += "b.b.in.d.d[0].d[0]" "b.b.in.d.d[0].f" += "b.b.in.d.d[0].d[1]" "b.b.in.d.d[0].t" += "b.b.in.d.d[1].d[0]" "b.b.in.d.d[1].f" += "b.b.in.d.d[1].d[1]" "b.b.in.d.d[1].t" += "b.b.in.d.d[2].d[0]" "b.b.in.d.d[2].f" += "b.b.in.d.d[2].d[1]" "b.b.in.d.d[2].t" += "b.b.in.d.d[3].d[0]" "b.b.in.d.d[3].f" += "b.b.in.d.d[3].d[1]" "b.b.in.d.d[3].t" += "b.b.in.d.d[4].d[0]" "b.b.in.d.d[4].f" += "b.b.in.d.d[4].d[1]" "b.b.in.d.d[4].t" += "b.b.in.d.d[4].d[0]" "b.b.in.d.d[4].f" += "b.b.in.d.d[4].d[1]" "b.b.in.d.d[4].t" += "b.b.in.d.d[3].d[0]" "b.b.in.d.d[3].f" += "b.b.in.d.d[3].d[1]" "b.b.in.d.d[3].t" += "b.b.in.d.d[2].d[0]" "b.b.in.d.d[2].f" += "b.b.in.d.d[2].d[1]" "b.b.in.d.d[2].t" += "b.b.in.d.d[1].d[0]" "b.b.in.d.d[1].f" += "b.b.in.d.d[1].d[1]" "b.b.in.d.d[1].t" += "b.b.in.d.d[0].d[0]" "b.b.in.d.d[0].f" += "b.b.in.d.d[0].d[1]" "b.b.in.d.d[0].t" += "b.b.in.d.d[4].d[0]" "b.b.in.d.d[4].f" += "b.b.in.d.d[4].d[1]" "b.b.in.d.d[4].t" += "b.b.in.d.d[3].d[0]" "b.b.in.d.d[3].f" += "b.b.in.d.d[3].d[1]" "b.b.in.d.d[3].t" += "b.b.in.d.d[2].d[0]" "b.b.in.d.d[2].f" += "b.b.in.d.d[2].d[1]" "b.b.in.d.d[2].t" += "b.b.in.d.d[1].d[0]" "b.b.in.d.d[1].f" += "b.b.in.d.d[1].d[1]" "b.b.in.d.d[1].t" += "b.b.in.d.d[0].d[0]" "b.b.in.d.d[0].f" += "b.b.in.d.d[0].d[1]" "b.b.in.d.d[0].t" += "b.b.in.d.d[0].f" "b.b.vc.in.d[0].f" += "b.b.in.d.d[0].t" "b.b.vc.in.d[0].t" += "b.b.in.d.d[0].d[0]" "b.b.vc.in.d[0].d[0]" += "b.b.in.d.d[0].d[1]" "b.b.vc.in.d[0].d[1]" += "b.b.in.d.d[1].f" "b.b.vc.in.d[1].f" += "b.b.in.d.d[1].t" "b.b.vc.in.d[1].t" += "b.b.in.d.d[1].d[0]" "b.b.vc.in.d[1].d[0]" += "b.b.in.d.d[1].d[1]" "b.b.vc.in.d[1].d[1]" += "b.b.in.d.d[2].f" "b.b.vc.in.d[2].f" += "b.b.in.d.d[2].t" "b.b.vc.in.d[2].t" += "b.b.in.d.d[2].d[0]" "b.b.vc.in.d[2].d[0]" += "b.b.in.d.d[2].d[1]" "b.b.vc.in.d[2].d[1]" += "b.b.in.d.d[3].f" "b.b.vc.in.d[3].f" += "b.b.in.d.d[3].t" "b.b.vc.in.d[3].t" += "b.b.in.d.d[3].d[0]" "b.b.vc.in.d[3].d[0]" += "b.b.in.d.d[3].d[1]" "b.b.vc.in.d[3].d[1]" += "b.b.in.d.d[4].f" "b.b.vc.in.d[4].f" += "b.b.in.d.d[4].t" "b.b.vc.in.d[4].t" += "b.b.in.d.d[4].d[0]" "b.b.vc.in.d[4].d[0]" += "b.b.in.d.d[4].d[1]" "b.b.vc.in.d[4].d[1]" += "b.b.in.a" "b.b.en_ctl.c1" += "b.b.in.a" "b.b.inack_ctl.y" += "b.b.in.v" "b.b.in_v_bufN.in" += "b.b.in.v" "b.b.in_v_buf4.y" += "b.b.in.v" "b.b.inack_ctl.c2" += "b.b.in.d.d[4].d[0]" "b.b.f_buf_func[4].n1" += "b.b.in.d.d[4].d[0]" "b.b.in.d.d[4].f" += "b.b.in.d.d[4].d[1]" "b.b.t_buf_func[4].n1" += "b.b.in.d.d[4].d[1]" "b.b.in.d.d[4].t" += "b.b.in.d.d[3].d[0]" "b.b.f_buf_func[3].n1" += "b.b.in.d.d[3].d[0]" "b.b.in.d.d[3].f" += "b.b.in.d.d[3].d[1]" "b.b.t_buf_func[3].n1" += "b.b.in.d.d[3].d[1]" "b.b.in.d.d[3].t" += "b.b.in.d.d[2].d[0]" "b.b.f_buf_func[2].n1" += "b.b.in.d.d[2].d[0]" "b.b.in.d.d[2].f" += "b.b.in.d.d[2].d[1]" "b.b.t_buf_func[2].n1" += "b.b.in.d.d[2].d[1]" "b.b.in.d.d[2].t" += "b.b.in.d.d[1].d[0]" "b.b.f_buf_func[1].n1" += "b.b.in.d.d[1].d[0]" "b.b.in.d.d[1].f" += "b.b.in.d.d[1].d[1]" "b.b.t_buf_func[1].n1" += "b.b.in.d.d[1].d[1]" "b.b.in.d.d[1].t" += "b.b.in.d.d[0].d[0]" "b.b.f_buf_func[0].n1" += "b.b.in.d.d[0].d[0]" "b.b.in.d.d[0].f" += "b.b.in.d.d[0].d[1]" "b.b.t_buf_func[0].n1" += "b.b.in.d.d[0].d[1]" "b.b.in.d.d[0].t" +"b.b.reset_buf.a"->"b.b.reset_buf._y"- +~("b.b.reset_buf.a")->"b.b.reset_buf._y"+ +"b.b.reset_buf._y"->"b.b.reset_buf.y"- +~("b.b.reset_buf._y")->"b.b.reset_buf.y"+ += "b.b._in_v" "b.b.in_v_buf4.a" += "b.b._in_v" "b.b.vc.out" += "b.b._out_a_BX_t[0]" "b.b.out_a_B_buf_f.out[0]" += "b.b._out_a_BX_t[1]" "b.b.out_a_B_buf_f.out[1]" += "b.b._out_a_BX_t[2]" "b.b.out_a_B_buf_f.out[2]" += "b.b._out_a_BX_t[3]" "b.b.out_a_B_buf_f.out[3]" += "b.b._out_a_BX_t[4]" "b.b.out_a_B_buf_f.out[4]" += "b.b._out_a_BX_t[0]" "b.b.t_buf_func[4].c2" += "b.b._out_a_BX_t[0]" "b.b.t_buf_func[3].c2" += "b.b._out_a_BX_t[0]" "b.b.t_buf_func[2].c2" += "b.b._out_a_BX_t[0]" "b.b.t_buf_func[1].c2" += "b.b._out_a_BX_t[0]" "b.b.t_buf_func[0].c2" += "b.b._out_a_BX_t[0]" "b.b._out_a_BX_t[4]" += "b.b._out_a_BX_t[0]" "b.b._out_a_BX_t[3]" += "b.b._out_a_BX_t[0]" "b.b._out_a_BX_t[2]" += "b.b._out_a_BX_t[0]" "b.b._out_a_BX_t[1]" += "b.b._reset_BX" "b.b.reset_bufarray.in" += "b.b._reset_BX" "b.b.reset_buf.y" += "b.b._reset_BX" "b.b.inack_ctl.sr_B" += "b.b._reset_BX" "b.b.inack_ctl.pr_B" += "b.b.reset_B" "b.b.reset_buf.a" +"b.b.en_buf_f.buf2.a"->"b.b.en_buf_f.buf2._y"- +~("b.b.en_buf_f.buf2.a")->"b.b.en_buf_f.buf2._y"+ +"b.b.en_buf_f.buf2._y"->"b.b.en_buf_f.buf2.y"- +~("b.b.en_buf_f.buf2._y")->"b.b.en_buf_f.buf2.y"+ += "b.b.en_buf_f.supply.vdd" "b.b.en_buf_f.buf2.vdd" += "b.b.en_buf_f.supply.vss" "b.b.en_buf_f.buf2.vss" += "b.b.en_buf_f.out[0]" "b.b.en_buf_f.out[4]" += "b.b.en_buf_f.out[0]" "b.b.en_buf_f.out[3]" += "b.b.en_buf_f.out[0]" "b.b.en_buf_f.out[2]" += "b.b.en_buf_f.out[0]" "b.b.en_buf_f.out[1]" += "b.b.en_buf_f.out[0]" "b.b.en_buf_f.buf2.y" += "b.b.en_buf_f.in" "b.b.en_buf_f.buf2.a" +"b.b.en_buf_t.buf2.a"->"b.b.en_buf_t.buf2._y"- +~("b.b.en_buf_t.buf2.a")->"b.b.en_buf_t.buf2._y"+ +"b.b.en_buf_t.buf2._y"->"b.b.en_buf_t.buf2.y"- +~("b.b.en_buf_t.buf2._y")->"b.b.en_buf_t.buf2.y"+ += "b.b.en_buf_t.supply.vdd" "b.b.en_buf_t.buf2.vdd" += "b.b.en_buf_t.supply.vss" "b.b.en_buf_t.buf2.vss" += "b.b.en_buf_t.out[0]" "b.b.en_buf_t.out[4]" += "b.b.en_buf_t.out[0]" "b.b.en_buf_t.out[3]" += "b.b.en_buf_t.out[0]" "b.b.en_buf_t.out[2]" += "b.b.en_buf_t.out[0]" "b.b.en_buf_t.out[1]" += "b.b.en_buf_t.out[0]" "b.b.en_buf_t.buf2.y" += "b.b.en_buf_t.in" "b.b.en_buf_t.buf2.a" += "b.b._out_a_B" "b.b.out_a_B_buf_t.in" += "b.b._out_a_B" "b.b.out_a_B_buf_f.in" += "b.b._out_a_B" "b.b.out_a_inv.y" += "b.b._reset_BXX[0]" "b.b.reset_bufarray.out[0]" += "b.b._reset_BXX[1]" "b.b.reset_bufarray.out[1]" += "b.b._reset_BXX[2]" "b.b.reset_bufarray.out[2]" += "b.b._reset_BXX[3]" "b.b.reset_bufarray.out[3]" += "b.b._reset_BXX[4]" "b.b.reset_bufarray.out[4]" += "b.b._reset_BXX[0]" "b.b.f_buf_func[4].sr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[4].pr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[4].sr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[4].pr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[3].sr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[3].pr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[3].sr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[3].pr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[2].sr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[2].pr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[2].sr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[2].pr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[1].sr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[1].pr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[1].sr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[1].pr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[0].sr_B" += "b.b._reset_BXX[0]" "b.b.f_buf_func[0].pr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[0].sr_B" += "b.b._reset_BXX[0]" "b.b.t_buf_func[0].pr_B" += "b.b._reset_BXX[0]" "b.b._reset_BXX[4]" += "b.b._reset_BXX[0]" "b.b._reset_BXX[3]" += "b.b._reset_BXX[0]" "b.b._reset_BXX[2]" += "b.b._reset_BXX[0]" "b.b._reset_BXX[1]" += "b.b._in_vX[0]" "b.b.in_v_bufN.out[0]" += "b.b._in_vX[1]" "b.b.in_v_bufN.out[1]" += "b.b._in_vX[2]" "b.b.in_v_bufN.out[2]" += "b.b._in_vX[3]" "b.b.in_v_bufN.out[3]" += "b.b._in_vX[4]" "b.b.in_v_bufN.out[4]" += "b.b._in_vX[0]" "b.b.t_buf_func[4].n2" += "b.b._in_vX[0]" "b.b.f_buf_func[4].n2" += "b.b._in_vX[0]" "b.b.t_buf_func[3].n2" += "b.b._in_vX[0]" "b.b.f_buf_func[3].n2" += "b.b._in_vX[0]" "b.b.t_buf_func[2].n2" += "b.b._in_vX[0]" "b.b.f_buf_func[2].n2" += "b.b._in_vX[0]" "b.b.t_buf_func[1].n2" += "b.b._in_vX[0]" "b.b.f_buf_func[1].n2" += "b.b._in_vX[0]" "b.b.t_buf_func[0].n2" += "b.b._in_vX[0]" "b.b.f_buf_func[0].n2" += "b.b._in_vX[0]" "b.b._in_vX[4]" += "b.b._in_vX[0]" "b.b._in_vX[3]" += "b.b._in_vX[0]" "b.b._in_vX[2]" += "b.b._in_vX[0]" "b.b._in_vX[1]" +"b.b.in_v_bufN.buf2.a"->"b.b.in_v_bufN.buf2._y"- +~("b.b.in_v_bufN.buf2.a")->"b.b.in_v_bufN.buf2._y"+ +"b.b.in_v_bufN.buf2._y"->"b.b.in_v_bufN.buf2.y"- +~("b.b.in_v_bufN.buf2._y")->"b.b.in_v_bufN.buf2.y"+ += "b.b.in_v_bufN.supply.vdd" "b.b.in_v_bufN.buf2.vdd" += "b.b.in_v_bufN.supply.vss" "b.b.in_v_bufN.buf2.vss" += "b.b.in_v_bufN.out[0]" "b.b.in_v_bufN.out[4]" += "b.b.in_v_bufN.out[0]" "b.b.in_v_bufN.out[3]" += "b.b.in_v_bufN.out[0]" "b.b.in_v_bufN.out[2]" += "b.b.in_v_bufN.out[0]" "b.b.in_v_bufN.out[1]" += "b.b.in_v_bufN.out[0]" "b.b.in_v_bufN.buf2.y" += "b.b.in_v_bufN.in" "b.b.in_v_bufN.buf2.a" +~"b.b.t_buf_func[0].c1"&~"b.b.t_buf_func[0].c2"|~"b.b.t_buf_func[0].pr_B"->"b.b.t_buf_func[0]._y"+ +"b.b.t_buf_func[0].c1"&"b.b.t_buf_func[0].c2"&"b.b.t_buf_func[0].n1"&"b.b.t_buf_func[0].n2"&"b.b.t_buf_func[0].sr_B"->"b.b.t_buf_func[0]._y"- +"b.b.t_buf_func[0]._y"->"b.b.t_buf_func[0].y"- +~("b.b.t_buf_func[0]._y")->"b.b.t_buf_func[0].y"+ +~"b.b.t_buf_func[1].c1"&~"b.b.t_buf_func[1].c2"|~"b.b.t_buf_func[1].pr_B"->"b.b.t_buf_func[1]._y"+ +"b.b.t_buf_func[1].c1"&"b.b.t_buf_func[1].c2"&"b.b.t_buf_func[1].n1"&"b.b.t_buf_func[1].n2"&"b.b.t_buf_func[1].sr_B"->"b.b.t_buf_func[1]._y"- +"b.b.t_buf_func[1]._y"->"b.b.t_buf_func[1].y"- +~("b.b.t_buf_func[1]._y")->"b.b.t_buf_func[1].y"+ +~"b.b.t_buf_func[2].c1"&~"b.b.t_buf_func[2].c2"|~"b.b.t_buf_func[2].pr_B"->"b.b.t_buf_func[2]._y"+ +"b.b.t_buf_func[2].c1"&"b.b.t_buf_func[2].c2"&"b.b.t_buf_func[2].n1"&"b.b.t_buf_func[2].n2"&"b.b.t_buf_func[2].sr_B"->"b.b.t_buf_func[2]._y"- +"b.b.t_buf_func[2]._y"->"b.b.t_buf_func[2].y"- +~("b.b.t_buf_func[2]._y")->"b.b.t_buf_func[2].y"+ +~"b.b.t_buf_func[3].c1"&~"b.b.t_buf_func[3].c2"|~"b.b.t_buf_func[3].pr_B"->"b.b.t_buf_func[3]._y"+ +"b.b.t_buf_func[3].c1"&"b.b.t_buf_func[3].c2"&"b.b.t_buf_func[3].n1"&"b.b.t_buf_func[3].n2"&"b.b.t_buf_func[3].sr_B"->"b.b.t_buf_func[3]._y"- +"b.b.t_buf_func[3]._y"->"b.b.t_buf_func[3].y"- +~("b.b.t_buf_func[3]._y")->"b.b.t_buf_func[3].y"+ +~"b.b.t_buf_func[4].c1"&~"b.b.t_buf_func[4].c2"|~"b.b.t_buf_func[4].pr_B"->"b.b.t_buf_func[4]._y"+ +"b.b.t_buf_func[4].c1"&"b.b.t_buf_func[4].c2"&"b.b.t_buf_func[4].n1"&"b.b.t_buf_func[4].n2"&"b.b.t_buf_func[4].sr_B"->"b.b.t_buf_func[4]._y"- +"b.b.t_buf_func[4]._y"->"b.b.t_buf_func[4].y"- +~("b.b.t_buf_func[4]._y")->"b.b.t_buf_func[4].y"+ +~"b.b.f_buf_func[0].c1"&~"b.b.f_buf_func[0].c2"|~"b.b.f_buf_func[0].pr_B"->"b.b.f_buf_func[0]._y"+ +"b.b.f_buf_func[0].c1"&"b.b.f_buf_func[0].c2"&"b.b.f_buf_func[0].n1"&"b.b.f_buf_func[0].n2"&"b.b.f_buf_func[0].sr_B"->"b.b.f_buf_func[0]._y"- +"b.b.f_buf_func[0]._y"->"b.b.f_buf_func[0].y"- +~("b.b.f_buf_func[0]._y")->"b.b.f_buf_func[0].y"+ +~"b.b.f_buf_func[1].c1"&~"b.b.f_buf_func[1].c2"|~"b.b.f_buf_func[1].pr_B"->"b.b.f_buf_func[1]._y"+ +"b.b.f_buf_func[1].c1"&"b.b.f_buf_func[1].c2"&"b.b.f_buf_func[1].n1"&"b.b.f_buf_func[1].n2"&"b.b.f_buf_func[1].sr_B"->"b.b.f_buf_func[1]._y"- +"b.b.f_buf_func[1]._y"->"b.b.f_buf_func[1].y"- +~("b.b.f_buf_func[1]._y")->"b.b.f_buf_func[1].y"+ +~"b.b.f_buf_func[2].c1"&~"b.b.f_buf_func[2].c2"|~"b.b.f_buf_func[2].pr_B"->"b.b.f_buf_func[2]._y"+ +"b.b.f_buf_func[2].c1"&"b.b.f_buf_func[2].c2"&"b.b.f_buf_func[2].n1"&"b.b.f_buf_func[2].n2"&"b.b.f_buf_func[2].sr_B"->"b.b.f_buf_func[2]._y"- +"b.b.f_buf_func[2]._y"->"b.b.f_buf_func[2].y"- +~("b.b.f_buf_func[2]._y")->"b.b.f_buf_func[2].y"+ +~"b.b.f_buf_func[3].c1"&~"b.b.f_buf_func[3].c2"|~"b.b.f_buf_func[3].pr_B"->"b.b.f_buf_func[3]._y"+ +"b.b.f_buf_func[3].c1"&"b.b.f_buf_func[3].c2"&"b.b.f_buf_func[3].n1"&"b.b.f_buf_func[3].n2"&"b.b.f_buf_func[3].sr_B"->"b.b.f_buf_func[3]._y"- +"b.b.f_buf_func[3]._y"->"b.b.f_buf_func[3].y"- +~("b.b.f_buf_func[3]._y")->"b.b.f_buf_func[3].y"+ +~"b.b.f_buf_func[4].c1"&~"b.b.f_buf_func[4].c2"|~"b.b.f_buf_func[4].pr_B"->"b.b.f_buf_func[4]._y"+ +"b.b.f_buf_func[4].c1"&"b.b.f_buf_func[4].c2"&"b.b.f_buf_func[4].n1"&"b.b.f_buf_func[4].n2"&"b.b.f_buf_func[4].sr_B"->"b.b.f_buf_func[4]._y"- +"b.b.f_buf_func[4]._y"->"b.b.f_buf_func[4].y"- +~("b.b.f_buf_func[4]._y")->"b.b.f_buf_func[4].y"+ += "b.b._en_X_t[0]" "b.b.en_buf_t.out[0]" += "b.b._en_X_t[1]" "b.b.en_buf_t.out[1]" += "b.b._en_X_t[2]" "b.b.en_buf_t.out[2]" += "b.b._en_X_t[3]" "b.b.en_buf_t.out[3]" += "b.b._en_X_t[4]" "b.b.en_buf_t.out[4]" += "b.b._en_X_t[0]" "b.b.t_buf_func[4].c1" += "b.b._en_X_t[0]" "b.b.t_buf_func[3].c1" += "b.b._en_X_t[0]" "b.b.t_buf_func[2].c1" += "b.b._en_X_t[0]" "b.b.t_buf_func[1].c1" += "b.b._en_X_t[0]" "b.b.t_buf_func[0].c1" += "b.b._en_X_t[0]" "b.b._en_X_t[4]" += "b.b._en_X_t[0]" "b.b._en_X_t[3]" += "b.b._en_X_t[0]" "b.b._en_X_t[2]" += "b.b._en_X_t[0]" "b.b._en_X_t[1]" += "Vdd" "b.b.supply.vdd" += "GND" "b.b.supply.vss" += "b._reset_B" "b.b.reset_B" += "b.out.d.d[0].d[0]" "b.out.d.d[0].f" += "b.out.d.d[0].d[1]" "b.out.d.d[0].t" += "b.out.d.d[1].d[0]" "b.out.d.d[1].f" += "b.out.d.d[1].d[1]" "b.out.d.d[1].t" += "b.out.d.d[2].d[0]" "b.out.d.d[2].f" += "b.out.d.d[2].d[1]" "b.out.d.d[2].t" += "b.out.d.d[3].d[0]" "b.out.d.d[3].f" += "b.out.d.d[3].d[1]" "b.out.d.d[3].t" += "b.out.d.d[4].d[0]" "b.out.d.d[4].f" += "b.out.d.d[4].d[1]" "b.out.d.d[4].t" += "b.out.d.d[4].d[0]" "b.out.d.d[4].f" += "b.out.d.d[4].d[1]" "b.out.d.d[4].t" += "b.out.d.d[3].d[0]" "b.out.d.d[3].f" += "b.out.d.d[3].d[1]" "b.out.d.d[3].t" += "b.out.d.d[2].d[0]" "b.out.d.d[2].f" += "b.out.d.d[2].d[1]" "b.out.d.d[2].t" += "b.out.d.d[1].d[0]" "b.out.d.d[1].f" += "b.out.d.d[1].d[1]" "b.out.d.d[1].t" += "b.out.d.d[0].d[0]" "b.out.d.d[0].f" += "b.out.d.d[0].d[1]" "b.out.d.d[0].t" += "b.out.d.d[4].d[0]" "b.out.d.d[4].f" += "b.out.d.d[4].d[1]" "b.out.d.d[4].t" += "b.out.d.d[3].d[0]" "b.out.d.d[3].f" += "b.out.d.d[3].d[1]" "b.out.d.d[3].t" += "b.out.d.d[2].d[0]" "b.out.d.d[2].f" += "b.out.d.d[2].d[1]" "b.out.d.d[2].t" += "b.out.d.d[1].d[0]" "b.out.d.d[1].f" += "b.out.d.d[1].d[1]" "b.out.d.d[1].t" += "b.out.d.d[0].d[0]" "b.out.d.d[0].f" += "b.out.d.d[0].d[1]" "b.out.d.d[0].t" += "b.out.v" "b.b.out.v" += "b.out.a" "b.b.out.a" += "b.out.d.d[0].f" "b.b.out.d.d[0].f" += "b.out.d.d[0].t" "b.b.out.d.d[0].t" += "b.out.d.d[0].d[0]" "b.b.out.d.d[0].d[0]" += "b.out.d.d[0].d[1]" "b.b.out.d.d[0].d[1]" += "b.out.d.d[1].f" "b.b.out.d.d[1].f" += "b.out.d.d[1].t" "b.b.out.d.d[1].t" += "b.out.d.d[1].d[0]" "b.b.out.d.d[1].d[0]" += "b.out.d.d[1].d[1]" "b.b.out.d.d[1].d[1]" += "b.out.d.d[2].f" "b.b.out.d.d[2].f" += "b.out.d.d[2].t" "b.b.out.d.d[2].t" += "b.out.d.d[2].d[0]" "b.b.out.d.d[2].d[0]" += "b.out.d.d[2].d[1]" "b.b.out.d.d[2].d[1]" += "b.out.d.d[3].f" "b.b.out.d.d[3].f" += "b.out.d.d[3].t" "b.b.out.d.d[3].t" += "b.out.d.d[3].d[0]" "b.b.out.d.d[3].d[0]" += "b.out.d.d[3].d[1]" "b.b.out.d.d[3].d[1]" += "b.out.d.d[4].f" "b.b.out.d.d[4].f" += "b.out.d.d[4].t" "b.b.out.d.d[4].t" += "b.out.d.d[4].d[0]" "b.b.out.d.d[4].d[0]" += "b.out.d.d[4].d[1]" "b.b.out.d.d[4].d[1]" += "b.out.d.d[4].d[0]" "b.out.d.d[4].f" += "b.out.d.d[4].d[1]" "b.out.d.d[4].t" += "b.out.d.d[3].d[0]" "b.out.d.d[3].f" += "b.out.d.d[3].d[1]" "b.out.d.d[3].t" += "b.out.d.d[2].d[0]" "b.out.d.d[2].f" += "b.out.d.d[2].d[1]" "b.out.d.d[2].t" += "b.out.d.d[1].d[0]" "b.out.d.d[1].f" += "b.out.d.d[1].d[1]" "b.out.d.d[1].t" += "b.out.d.d[0].d[0]" "b.out.d.d[0].f" += "b.out.d.d[0].d[1]" "b.out.d.d[0].t" += "b.in.d.d[0].d[0]" "b.in.d.d[0].f" += "b.in.d.d[0].d[1]" "b.in.d.d[0].t" += "b.in.d.d[1].d[0]" "b.in.d.d[1].f" += "b.in.d.d[1].d[1]" "b.in.d.d[1].t" += "b.in.d.d[2].d[0]" "b.in.d.d[2].f" += "b.in.d.d[2].d[1]" "b.in.d.d[2].t" += "b.in.d.d[3].d[0]" "b.in.d.d[3].f" += "b.in.d.d[3].d[1]" "b.in.d.d[3].t" += "b.in.d.d[4].d[0]" "b.in.d.d[4].f" += "b.in.d.d[4].d[1]" "b.in.d.d[4].t" += "b.in.d.d[4].d[0]" "b.in.d.d[4].f" += "b.in.d.d[4].d[1]" "b.in.d.d[4].t" += "b.in.d.d[3].d[0]" "b.in.d.d[3].f" += "b.in.d.d[3].d[1]" "b.in.d.d[3].t" += "b.in.d.d[2].d[0]" "b.in.d.d[2].f" += "b.in.d.d[2].d[1]" "b.in.d.d[2].t" += "b.in.d.d[1].d[0]" "b.in.d.d[1].f" += "b.in.d.d[1].d[1]" "b.in.d.d[1].t" += "b.in.d.d[0].d[0]" "b.in.d.d[0].f" += "b.in.d.d[0].d[1]" "b.in.d.d[0].t" += "b.in.d.d[4].d[0]" "b.in.d.d[4].f" += "b.in.d.d[4].d[1]" "b.in.d.d[4].t" += "b.in.d.d[3].d[0]" "b.in.d.d[3].f" += "b.in.d.d[3].d[1]" "b.in.d.d[3].t" += "b.in.d.d[2].d[0]" "b.in.d.d[2].f" += "b.in.d.d[2].d[1]" "b.in.d.d[2].t" += "b.in.d.d[1].d[0]" "b.in.d.d[1].f" += "b.in.d.d[1].d[1]" "b.in.d.d[1].t" += "b.in.d.d[0].d[0]" "b.in.d.d[0].f" += "b.in.d.d[0].d[1]" "b.in.d.d[0].t" += "b.in.v" "b.b.in.v" += "b.in.a" "b.b.in.a" += "b.in.d.d[0].f" "b.b.in.d.d[0].f" += "b.in.d.d[0].t" "b.b.in.d.d[0].t" += "b.in.d.d[0].d[0]" "b.b.in.d.d[0].d[0]" += "b.in.d.d[0].d[1]" "b.b.in.d.d[0].d[1]" += "b.in.d.d[1].f" "b.b.in.d.d[1].f" += "b.in.d.d[1].t" "b.b.in.d.d[1].t" += "b.in.d.d[1].d[0]" "b.b.in.d.d[1].d[0]" += "b.in.d.d[1].d[1]" "b.b.in.d.d[1].d[1]" += "b.in.d.d[2].f" "b.b.in.d.d[2].f" += "b.in.d.d[2].t" "b.b.in.d.d[2].t" += "b.in.d.d[2].d[0]" "b.b.in.d.d[2].d[0]" += "b.in.d.d[2].d[1]" "b.b.in.d.d[2].d[1]" += "b.in.d.d[3].f" "b.b.in.d.d[3].f" += "b.in.d.d[3].t" "b.b.in.d.d[3].t" += "b.in.d.d[3].d[0]" "b.b.in.d.d[3].d[0]" += "b.in.d.d[3].d[1]" "b.b.in.d.d[3].d[1]" += "b.in.d.d[4].f" "b.b.in.d.d[4].f" += "b.in.d.d[4].t" "b.b.in.d.d[4].t" += "b.in.d.d[4].d[0]" "b.b.in.d.d[4].d[0]" += "b.in.d.d[4].d[1]" "b.b.in.d.d[4].d[1]" += "b.in.d.d[4].d[0]" "b.in.d.d[4].f" += "b.in.d.d[4].d[1]" "b.in.d.d[4].t" += "b.in.d.d[3].d[0]" "b.in.d.d[3].f" += "b.in.d.d[3].d[1]" "b.in.d.d[3].t" += "b.in.d.d[2].d[0]" "b.in.d.d[2].f" += "b.in.d.d[2].d[1]" "b.in.d.d[2].t" += "b.in.d.d[1].d[0]" "b.in.d.d[1].f" += "b.in.d.d[1].d[1]" "b.in.d.d[1].t" += "b.in.d.d[0].d[0]" "b.in.d.d[0].f" += "b.in.d.d[0].d[1]" "b.in.d.d[0].t" diff --git a/test/unit_tests/buf_s_5/test.act b/test/unit_tests/buf_s_5/test.act new file mode 100644 index 0000000..75e1833 --- /dev/null +++ b/test/unit_tests/buf_s_5/test.act @@ -0,0 +1,47 @@ +/************************************************************************* + * + * 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/primitives.act"; +import globals; + +open tmpl::dataflow_neuro; + +defproc buffer_s_5(avMx1of2<5> in; avMx1of2<5> out) + +{ + bool _reset_B; + prs { + Reset => _reset_B- + } + buffer_s<5> b(.in = in, .out = out); + b.supply.vdd = Vdd; + b.supply.vss = GND; + b.reset_B = _reset_B; +} + +buffer_s_5 b; \ No newline at end of file diff --git a/test/unit_tests/buf_s_5/test.prsim b/test/unit_tests/buf_s_5/test.prsim new file mode 100644 index 0000000..f253f16 --- /dev/null +++ b/test/unit_tests/buf_s_5/test.prsim @@ -0,0 +1,64 @@ +watchall + +set-qdi-channel-neutral "b.in" 5 +set b.out.a 0 +set b.out.v 0 +# set b.in.a 1 +# set b.in.v 1 +set Reset 0 + +# Set output channel variables to all active (incorrect) +set b.out.d.d[0].t 1 +set b.out.d.d[0].f 1 +set b.out.d.d[1].t 1 +set b.out.d.d[1].f 1 +set b.out.d.d[2].t 1 +set b.out.d.d[2].f 1 +set b.out.d.d[3].t 1 +set b.out.d.d[3].f 1 +set b.out.d.d[4].t 1 +set b.out.d.d[4].f 1 + +cycle + +system "echo '[] set Reset 1'" +set Reset 1 +cycle + +system "echo '[] set Reset 0'" +set Reset 0 +cycle + +assert-qdi-channel-neutral "b.out" 5 + +status X +system "echo '[] Reset finished, setting some inputs.'" + +mode run + +set b.in.d.d[0].t 1 +set b.in.d.d[1].t 1 +set b.in.d.d[2].f 1 +set b.in.d.d[3].f 1 + +cycle + +system "echo '[] Setting final input'" + +set b.in.d.d[4].t 1 +cycle + +system "echo '[] Receiving out val'" + +set b.out.v 1 +cycle + +assert b.in.a 1 + +system "echo '[] Removing input'" +set-qdi-channel-neutral "b.in" 5 +cycle + +system "echo '[] Receiving out ack'" +set b.in.a 1 +cycle From 66cbbe3da765c8c44497c97190915c6871a9761d Mon Sep 17 00:00:00 2001 From: alexmadison Date: Tue, 1 Mar 2022 09:58:20 +0100 Subject: [PATCH 4/7] unit tests working --- test/unit_tests/buf_s_5/run/prsim.out | 18 +++++++++++++++++- test/unit_tests/buf_s_5/run/prsim.pdf | Bin 54472 -> 21864 bytes test/unit_tests/buf_s_5/test.prsim | 8 +++++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/test/unit_tests/buf_s_5/run/prsim.out b/test/unit_tests/buf_s_5/run/prsim.out index dbae83e..4a2d00d 100644 --- a/test/unit_tests/buf_s_5/run/prsim.out +++ b/test/unit_tests/buf_s_5/run/prsim.out @@ -81,8 +81,8 @@ b.b.vc.tmp[1] b.b.f_buf_func[3].n1 b.b.vc.C2Els[1]._y b.b._out_a_BX_f[0] b.b.t_b 198462 b.b._reset_BX : 1 [by b.b.reset_buf._y:=0] 200657 b.b.reset_bufarray.buf2._y : 0 [by b.b._reset_BX:=1] 200679 b.b._reset_BXX[0] : 1 [by b.b.reset_bufarray.buf2._y:=0] - [] Reset finished, setting some inputs. + 200679 b.b.t_buf_func[0].n1 : 1 200679 b.b.f_buf_func[3].n1 : 1 200679 b.b.f_buf_func[2].n1 : 1 @@ -155,3 +155,19 @@ b.b.vc.tmp[1] b.b.f_buf_func[3].n1 b.b.vc.C2Els[1]._y b.b._out_a_BX_f[0] b.b.t_b 506989 b.b.in_v_bufN.buf2._y : 1 [by b.in.v:=0] 508590 b.b._in_vX[0] : 0 [by b.b.in_v_bufN.buf2._y:=1] [] Receiving out ack + 508590 b.out.a : 1 + 508743 b.b._out_a_B : 0 [by b.out.a:=1] + 508787 b.b.out_a_B_buf_t.buf2._y : 1 [by b.b._out_a_B:=0] + 511504 b.b.out_a_B_buf_f.buf2._y : 1 [by b.b._out_a_B:=0] + 511505 b.b._out_a_BX_t[0] : 0 [by b.b.out_a_B_buf_f.buf2._y:=1] + 511506 b.b.t_buf_func[4]._y : 1 [by b.b._out_a_BX_t[0]:=0] + 511527 b.b.t_buf_func[1]._y : 1 [by b.b._out_a_BX_t[0]:=0] + 511722 b.b.t_buf_func[0]._y : 1 [by b.b._out_a_BX_t[0]:=0] + 511881 b.b.t_buf_func[0].y : 0 [by b.b.t_buf_func[0]._y:=1] + 513087 b.b.t_buf_func[4].y : 0 [by b.b.t_buf_func[4]._y:=1] + 520872 b.b.t_buf_func[1].y : 0 [by b.b.t_buf_func[1]._y:=1] + 522470 b.b._out_a_BX_f[0] : 0 [by b.b.out_a_B_buf_t.buf2._y:=1] + 523757 b.b.f_buf_func[3]._y : 1 [by b.b._out_a_BX_f[0]:=0] + 525989 b.b.f_buf_func[3].y : 0 [by b.b.f_buf_func[3]._y:=1] + 542146 b.b.f_buf_func[2]._y : 1 [by b.b._out_a_BX_f[0]:=0] + 542291 b.b.f_buf_func[2].y : 0 [by b.b.f_buf_func[2]._y:=1] diff --git a/test/unit_tests/buf_s_5/run/prsim.pdf b/test/unit_tests/buf_s_5/run/prsim.pdf index 898f10abd33b01b5d7e0d8dafb6bf316cb8c9ebc..eb90963f375cbe25d037d6bb265753ce706f58e5 100644 GIT binary patch delta 9665 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 literal 54472 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%0AB;= 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 Date: Tue, 1 Mar 2022 10:15:23 +0100 Subject: [PATCH 5/7] changed c->v tree in buf_s --- dataflow_neuro/primitives.act | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dataflow_neuro/primitives.act b/dataflow_neuro/primitives.act index 70810b3..259428f 100644 --- a/dataflow_neuro/primitives.act +++ b/dataflow_neuro/primitives.act @@ -167,11 +167,11 @@ namespace tmpl { BUF_X1 reset_buf(.a=reset_B, .y=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); - sigbuf reset_bufarray(.in=_reset_BX, .out=_reset_BXX); + sigbuf reset_bufarray(.in=_reset_BX, .out=_reset_BXX); //validity bool _in_v, _in_vX[N]; - ctree vc(.in=in.d,.out=_in_v,.supply=supply); + vtree vc(.in=in.d,.out=_in_v,.supply=supply); BUF_X4 in_v_buf4(.a=_in_v, .y=in.v,.vdd=supply.vdd,.vss=supply.vss); sigbuf in_v_bufN(.in = in.v, .out = _in_vX, .supply = supply); From c947b28b0384d509a94a3c903b0ee7a92bcf7e04 Mon Sep 17 00:00:00 2001 From: alexmadison Date: Tue, 1 Mar 2022 10:18:32 +0100 Subject: [PATCH 6/7] added yours truely to the authors --- dataflow_neuro/primitives.act | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dataflow_neuro/primitives.act b/dataflow_neuro/primitives.act index 259428f..77adc2c 100644 --- a/dataflow_neuro/primitives.act +++ b/dataflow_neuro/primitives.act @@ -5,6 +5,8 @@ * Copyright (c) 2022 University of Groningen - Ole Richter * Copyright (c) 2022 University of Groningen - Michele Mastella * Copyright (c) 2022 University of Groningen - Hugh Greatorex + * Copyright (c) 2022 University of Groningen - Madison Cotteret + * * * This source describes Open Hardware and is licensed under the CERN-OHL-W v2 or later * From fc4ccea3c05c6356d0f4d7f60bc301945d653dd4 Mon Sep 17 00:00:00 2001 From: alexmadison Date: Tue, 1 Mar 2022 12:22:36 +0100 Subject: [PATCH 7/7] 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 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 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 +