From 3fc4b1fb1a6c27d5c36665fc083ad82d1220872f Mon Sep 17 00:00:00 2001 From: alexmadison Date: Mon, 28 Feb 2022 18:27:03 +0100 Subject: [PATCH] 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) {