dropper static with unit tests
This commit is contained in:
@ -398,6 +398,7 @@ namespace tmpl {
|
||||
defproc demux_td (avMx1of2<N> in; avMx1of2<N> out1; a1of1 token; bool? reset_B; avMx1of2<1> cond; power supply) {
|
||||
//control
|
||||
bool _en, _reset_BX,_reset_BXX[N], _out_v, _in_c_v_, _reset_BXt;
|
||||
|
||||
|
||||
OR2_X1 out_or(.a=out1.v, .b=token.r, .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);
|
||||
@ -407,6 +408,10 @@ namespace tmpl {
|
||||
sigbuf<N> reset_bufarray(.in=_reset_BX, .out=_reset_BXX, .supply=supply);
|
||||
//validity
|
||||
bool _in_v, _c_tk_buf, _c_d_buf[N], _c_v, cond_inv_t, cond_inv_f;
|
||||
|
||||
|
||||
cond.a = in.a;
|
||||
cond.v = _c_v;
|
||||
|
||||
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);
|
||||
|
||||
@ -477,6 +482,63 @@ namespace tmpl {
|
||||
token_buf.pr_B = _reset_BXt;
|
||||
token_buf.sr_B = _reset_BXt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Drops a packet if condition is met, otherwise passes it on.
|
||||
* This is a very lazy implementation, where the cond MUST NOT CHANGE DURING OPERATION.
|
||||
* Means that this should be used in a very small set of circumstances.
|
||||
*
|
||||
* params:
|
||||
* N: size of packet
|
||||
* CONDITION_DROP: value of cond when packets are dropped.
|
||||
*/
|
||||
export template<pint N; pbool CONDITION_DROP>
|
||||
defproc dropper_static (avMx1of2<N> in; avMx1of2<N> out; bool? cond; power supply) {
|
||||
bool _drop, _dropB;
|
||||
INV_X1 inv(.a = cond, .vss = supply.vss, .vdd = supply.vdd);
|
||||
|
||||
[~CONDITION_DROP ->
|
||||
_dropB = cond;
|
||||
_drop = inv.y;
|
||||
[] CONDITION_DROP ->
|
||||
_drop = cond;
|
||||
_dropB = inv.y;
|
||||
]
|
||||
|
||||
bool _in_vX;
|
||||
vtree<N> vt(.in = in.d, .supply = supply);
|
||||
BUF_X4 in_v_buf(.a = vt.out, .y = _in_vX, .vss = supply.vss, .vdd = supply.vdd);
|
||||
AND2_X1 and2(.a = _drop, .b = _in_vX, .vss = supply.vss, .vdd = supply.vdd);
|
||||
OR2_X1 or2(.a = out.a, .b = and2.y, .vss = supply.vss, .vdd = supply.vdd);
|
||||
A_2C_B_X1 ack_Cel(.c1 = or2.y, .c2 = _in_vX, .y = in.a);
|
||||
_in_vX = in.v;
|
||||
|
||||
// Sigbufs
|
||||
sigbuf<N*2> sb_dropB(.in = _dropB, .supply = supply);
|
||||
sigbuf<N*2> sb_in_v(.in = _in_vX, .supply = supply);
|
||||
|
||||
AND3_X1 and_t[N];
|
||||
AND3_X1 and_f[N];
|
||||
(i:N:
|
||||
and_t[i].a = in.d.d[i].t;
|
||||
and_f[i].a = in.d.d[i].f;
|
||||
|
||||
and_t[i].y = out.d.d[i].t;
|
||||
and_f[i].y = out.d.d[i].f;
|
||||
|
||||
and_t[i].b = sb_dropB.out[i];
|
||||
and_f[i].b = sb_dropB.out[i+N];
|
||||
|
||||
and_t[i].c = sb_in_v.out[i];
|
||||
and_f[i].c = sb_in_v.out[i+N];
|
||||
|
||||
and_t[i].vss = supply.vss;
|
||||
and_t[i].vdd = supply.vdd;
|
||||
)
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
export
|
||||
@ -690,7 +752,7 @@ namespace tmpl {
|
||||
// Is useful for testing purposes.
|
||||
// But should probably remove before running innovus etc.
|
||||
export template<pint N>
|
||||
defproc delay_fifo (bool out; bool in; power supply) {
|
||||
defproc delay_chain (bool out; bool in; power supply) {
|
||||
{ N >= 0 : "What?" };
|
||||
[N >= 1 ->
|
||||
DLY4_X1 dly[N];
|
||||
|
Reference in New Issue
Block a user