From 81032c1296da7cacb4c32361fc1a72def2ed02cb Mon Sep 17 00:00:00 2001 From: alexmadison Date: Mon, 11 Apr 2022 15:31:05 +0200 Subject: [PATCH] texel working with replaced encoder --- dataflow_neuro/chips.act | 2 +- dataflow_neuro/coders.act | 73 +++++++++++++++++++++++++++++++++--- dataflow_neuro/registers.act | 47 +++++++++++------------ 3 files changed, 90 insertions(+), 32 deletions(-) diff --git a/dataflow_neuro/chips.act b/dataflow_neuro/chips.act index d60fca8..f68ab40 100644 --- a/dataflow_neuro/chips.act +++ b/dataflow_neuro/chips.act @@ -106,7 +106,7 @@ defproc chip_texel (bd in, out; NC_NRN = NC_NRN_X + NC_NRN_Y; nrn_hs_2d_array nrn_grid(.in = neurons, .supply = supply, .reset_B = reset_B); - encoder2d encoder( + encoder2d_simple encoder( .inx = nrn_grid.outx, .iny = nrn_grid.outy, .reset_B = reset_B, .supply = supply diff --git a/dataflow_neuro/coders.act b/dataflow_neuro/coders.act index 00a557a..88f920b 100644 --- a/dataflow_neuro/coders.act +++ b/dataflow_neuro/coders.act @@ -591,7 +591,8 @@ defproc decoder_2d_hybrid (avMx1of2 in; a1of1 out[Nx*Ny]; bool? dly_cfg export template defproc buffer_s_func (Mx1of2 in; avMx1of2 out; bool? in_v, en, reset_B; power supply) { //function - bool _out_a_BX_t[N],_out_a_BX_f[N],_out_a_B,_en_X_t[N],_en_X_f[N], _in_vX, _in_vXX_t[N],_in_vXX_f[N]; + bool _out_a_BX_t[N],_out_a_BX_f[N],_out_a_B,_en_X_t[N],_en_X_f[N], _in_vX; + // bool _in_vXX_t[N],_in_vXX_f[N]; A_2C2N_RB_X4 f_buf_func[N]; @@ -613,8 +614,10 @@ defproc decoder_2d_hybrid (avMx1of2 in; a1of1 out[Nx*Ny]; bool? dly_cfg // in val signal buffers BUF_X4 in_v_prebuf(.a = in_v, .y = _in_vX, .vss = supply.vss, .vdd = supply.vdd); - sigbuf in_v_buf_t(.in=_in_vX, .out=_in_vXX_t, .supply=supply); - sigbuf in_v_buf_f(.in=_in_vX, .out=_in_vXX_f, .supply=supply); + // sigbuf in_v_buf_t(.in=_in_vX, .out=_in_vXX_t, .supply=supply); + // sigbuf in_v_buf_f(.in=_in_vX, .out=_in_vXX_f, .supply=supply); + sigbuf in_v_buf(.in=_in_vX,.supply=supply); + (i:N: f_buf_func[i].y=out.d.d[i].f; @@ -625,8 +628,8 @@ defproc decoder_2d_hybrid (avMx1of2 in; a1of1 out[Nx*Ny]; bool? dly_cfg t_buf_func[i].c2=_out_a_BX_t[i]; f_buf_func[i].n1=in.d[i].f; t_buf_func[i].n1=in.d[i].t; - f_buf_func[i].n2=_in_vXX_f[i]; - t_buf_func[i].n2=_in_vXX_t[i]; + f_buf_func[i].n2=in_v_buf.out[i]; + t_buf_func[i].n2=in_v_buf.out[i+N]; f_buf_func[i].vdd=supply.vdd; t_buf_func[i].vdd=supply.vdd; f_buf_func[i].vss=supply.vss; @@ -771,6 +774,66 @@ defproc decoder_2d_hybrid (avMx1of2 in; a1of1 out[Nx*Ny]; bool? dly_cfg } + export template + defproc encoder2d_simple(a1of1 inx[Nx]; a1of1 iny[Ny]; avMx1of2<(NxC + NyC)> out; + power supply; bool reset_B) { + + bool _a_x, _a_y; + bool _r_x, _r_y; + bool _r_x_B, _r_y_B; + + buffer buf(.out = out, .supply = supply, .reset_B = reset_B); + + // Arbiters + arbtree Xarb(.supply = supply); + arbtree Yarb(.supply = supply); + Xarb.out.a = _a_x; + Xarb.out.r = _r_x; + Yarb.out.a = _a_y; + Yarb.out.r = _r_y; + + // Encoders + dualrail_encoder Xenc(.supply = supply); + dualrail_encoder Yenc(.supply = supply); + + // Wire up inputs to encoders and arb + (i:Nx: + Xarb.in[i].r = inx[i].r; + Xarb.in[i].a = inx[i].a; + Xenc.in[i] = inx[i].a; + ) + + // Wire up inputs to encoders and arb + (i:Ny: + Yarb.in[i].r = iny[i].r; + Yarb.in[i].a = iny[i].a; + Yenc.in[i] = iny[i].a; + ) + + // INV_X2 inv_rx(.a = _r_x, .y _r_x_B, .vdd = supply.vdd, .vss = supply.vss); + // INV_X2 inv_ry(.a = _r_y, .y = _r_y_B, .vdd = supply.vdd, .vss = supply.vss); + INV_X2 inv_buf(.a = buf.in.a, .vdd = supply.vdd, .vss = supply.vss); + + A_2C_RB_X1 a_x_Cel(.c1 = inv_buf.y, .c2 = _r_x, .y = _a_x, + .sr_B = reset_B, .pr_B = reset_B, .vdd = supply.vdd, .vss = supply.vss); + A_2C_RB_X1 a_y_Cel(.c1 = inv_buf.y, .c2 = _r_y, .y = _a_y, + .sr_B = reset_B, .pr_B = reset_B, .vdd = supply.vdd, .vss = supply.vss); + + // A_2C_RB_X1 a_x_Cel(.c1 = buf.in.a, .c2 = _r_x_B, .y = _a_x, + // .sr_B = reset_B, .pr_B = reset_B, .vdd = supply.vdd, .vss = supply.vss); + // A_2C_RB_X1 a_y_Cel(.c1 = buf.in.a, .c2 = _r_y_B, .y = _a_y, + // .sr_B = reset_B, .pr_B = reset_B, .vdd = supply.vdd, .vss = supply.vss); + + // Wire up encoder to buffer + (i:NxC: + Xenc.out.d[i] = buf.in.d.d[i]; + ) + (i:NyC: + Yenc.out.d[i] = buf.in.d.d[i+NxC]; + ) + + } + /** * Neuron handshaking. diff --git a/dataflow_neuro/registers.act b/dataflow_neuro/registers.act index aaddde4..1e38b09 100644 --- a/dataflow_neuro/registers.act +++ b/dataflow_neuro/registers.act @@ -52,31 +52,31 @@ export template defproc buffer_register(avMx1of2 in; Mx1of2 out; bool? out_v, flush, reset_B; power supply) { -// BIG TODO -// I HAVE NOT BOTHERED WITH ANY SIGNAL BUFFERING IN HERE YET //control bool _en, _reset_BX,_reset_BXX[N]; bool _in_aB; bool _reset; -INV_X1 reset_inv(.a = reset_B, .y = _reset); +bool _resetX[N]; + +// Reset sigs +INV_X1 reset_inv(.a = reset_B, .y = _reset, .vdd = supply.vdd, .vss = supply.vss); +sigbuf reset_sb(.in = _reset, .out = _resetX, .supply = supply); +BUF_X1 reset_buf(.a=reset_B, .y=_reset_BX,.vdd=supply.vdd, .vss=supply.vss); +sigbuf resetB_bufarray(.in=_reset_BX, .out=_reset_BXX); A_2C1N_R_X1 inack_ctl(.c1=_in_aB,.c2=in.v,.n1=out_v,.y=_in_aB, .pr_B=_reset_BX,.sr_B=_reset_BX,.vdd=supply.vdd,.vss=supply.vss); INV_X1 inack_inv(.a = _in_aB, .y = in.a, .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); - -bool _flushB; +// Flush sigs +bool _flushB, _flushBX[N*2]; INV_X1 flush_inv(.a = flush, .y = _flushB); -// AND2_X1 flush_en(.a = _flushB, .b = _in_aB, .y = _en); +sigbuf flushB_sb(.in = _flushB, .out = _flushBX, .supply = supply); _en = _in_aB; -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; @@ -84,35 +84,30 @@ vtree vc(.in=in.d,.out=_in_v,.supply=supply); BUF_X4 in_v_buf(.a=_in_v, .y=in.v,.vdd=supply.vdd,.vss=supply.vss); //function -bool _out_a_BX_t[N],_out_a_BX_f[N],_out_a_B,_en_X_t[N],_en_X_f[N]; +bool _out_a_BX_t[N],_out_a_BX_f[N],_out_a_B; +// bool _en_X_t[N],_en_X_f[N]; A_1C2N_SB_X4 f_buf_func[N]; A_1C2N_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, .vss = supply.vss, .vdd = supply.vdd); -// 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 +// sigbuf en_buf_t(.in=_en, .out=_en_X_t, .supply=supply); +// sigbuf en_buf_t(.in=_en, .out=_en_X_t, .supply=supply); +sigbuf en_buf(.in=_en, .supply=supply); (i:N: f_buf_func[i].y=out.d[i].f; t_buf_func[i].y=out.d[i].t; - f_buf_func[i].c1=_flushB; - t_buf_func[i].c1=_flushB; + f_buf_func[i].c1=_flushBX[i]; + t_buf_func[i].c1=_flushBX[i+N]; - f_buf_func[i].n2=_en_X_f[i]; - t_buf_func[i].n2=_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].n2=en_buf.out[i]; + t_buf_func[i].n2=en_buf.out[i+N]; f_buf_func[i].n1=in.d.d[i].f; t_buf_func[i].n1=in.d.d[i].t; 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; - f_buf_func[i].pr = _reset; - f_buf_func[i].sr = _reset; + f_buf_func[i].pr = _resetX[i]; + f_buf_func[i].sr = _resetX[i]; t_buf_func[i].pr_B = _reset_BXX[i]; t_buf_func[i].sr_B = _reset_BXX[i]; )