diff --git a/dataflow_neuro/coders.act b/dataflow_neuro/coders.act index 1c2e8aa..61d8cd3 100644 --- a/dataflow_neuro/coders.act +++ b/dataflow_neuro/coders.act @@ -91,7 +91,7 @@ defproc decoder_dualrail (Mx1of2 in; bool? out[N]; power supply) { * Be careful of out[] indexing. */ export template -defproc decoder_dualrailX(Mx1of2 in; bool? out[N*OUT_STRENGTH]; power supply) { +defproc decoder_dualrail_x(Mx1of2 in; bool? out[N*OUT_STRENGTH]; power supply) { decoder_dualrail decoder(.in = in, .supply = supply); sigbuf sb[N]; (i:N: @@ -103,6 +103,35 @@ defproc decoder_dualrailX(Mx1of2 in; bool? out[N*OUT_STRENGTH]; power supply ) } +/** + * Dualrail decoder with on/off switch. + * Outputs are buffered. + */ +export template +defproc decoder_dualrail_en(Mx1of2 in; bool? en, out[N*OUT_STRENGTH]; power supply) { + decoder_dualrail decoder(.in = in, .supply = supply); + + sigbuf sb_en(.in = en, .supply = supply); + sigbuf sb[N]; + AND2_X1 en_ands[N]; + (i:N: + en_ands[i].a = decoder.out[i]; + en_ands[i].b = sb_en.out[i]; + + en_ands[i].vdd = supply.vdd; + en_ands[i].vss = supply.vss; + + sb[i].in = decoder.out[i]; + sb[i].supply = supply; + (j:OUT_STRENGTH: + sb[i].out[j] = out[j + i*OUT_STRENGTH]; + ) + + ) + +} + + /** * 2D decoder which uses a configurable delay from the VCtrees to buffer ack.