--- nand.py- +++ nand.py @@ -395,40 +395,26 @@ # en, inp_x, out_x def __init__(self, parent, bit_n, name='decoder', latency=10): Obj.__init__(self, parent, name) - self.n = bit_n - if bit_n == 1: - Pin(self, 'inp_0').conn = Joint(self, 'jt_inp').new_pin() - self.jt_inp.new_pin().conn = NOT(self, 'not_', latency).inp - self.not_.out.conn = AND(self, 'and_0', latency).inp_a - self.jt_inp.new_pin().conn = AND(self, 'and_1', latency).inp_a - Pin(self, 'en').conn = Joint(self, 'jt_en').new_pin() - self.jt_en.new_pin().conn = self.and_0.inp_b - self.jt_en.new_pin().conn = self.and_1.inp_b + jts = [] + for i in range(bit_n): + posi_nega = PosiNega( self, name_i('posi_nega', i), latency ) + Pin( self, name_i('inp', i) ).conn = posi_nega.inp + jt_Q = Joint( self, name_i('jt_Q', i) ) + jt_nQ = Joint( self, name_i('jt_nQ', i) ) + posi_nega.Q.conn = jt_Q.new_pin() + posi_nega.nQ.conn = jt_nQ.new_pin() + jts.append( (jt_nQ, jt_Q) ) - self.and_0.out.conn = Pin(self, 'out_0') - self.and_1.out.conn = Pin(self, 'out_1') - else: + n = 1 << bit_n + Pin(self, 'en').conn = GATE(self, n, 'gate', latency).en + for j in range(n): + and_n = AND_N( self, bit_n, name_i('and_n', j), latency ) + and_n.out.conn = getattr( self.gate, name_i('inp', j) ) + getattr( self.gate, name_i('out', j) ).conn = Pin( self, name_i('out', j) ) for i in range(bit_n): - Pin( self, name_i('inp', i) ) - bn1 = bit_n - 1 - DECODER(self, bn1, 'dec_u', latency) - DECODER(self, bn1, 'dec_d', latency) - Joint_N(self, bn1, 'jt_n') - self.jt_n.new_pin_conn(self, 'inp', 0, bn1, direc='from_targ') - self.jt_n.new_pin_conn(self.dec_u, 'inp') - self.jt_n.new_pin_conn(self.dec_d, 'inp') - - DECODER(self, 1, 'dec_1', latency) - msb = getattr( self, name_i('inp', bn1) ) - msb.conn = self.dec_1.inp_0 - Pin(self, 'en').conn = self.dec_1.en - self.dec_1.out_0.conn = self.dec_d.en - self.dec_1.out_1.conn = self.dec_u.en - - n1 = 1 << bn1 - new_pin_conn(self, self.dec_d, 0, n1, 'out', direc='from_in_obj') - new_pin_conn(self, self.dec_u, n1, n1, 'out', direc='from_in_obj') + jt = jts[i][ (j >> i) & 1 ] + jt.new_pin().conn = getattr( and_n, name_i('inp', i) ) class PinSet(Obj): # p_x