--- nand.py- +++ nand.py @@ -201,61 +201,25 @@ # inp_x, out def __init__(self, parent, n, name='and_n', latency=10): Obj.__init__(self, parent, name) - self.n = n - AND(self, 'and_', latency) - if n == 2: - Pin(self, 'inp_0').conn = self.and_.inp_a - Pin(self, 'inp_1').conn = self.and_.inp_b - - elif n == 3: - AND_N(self, 2, 'and_n', latency) - new_pin_conn(self, self.and_n, 0) - self.and_n.out.conn = self.and_.inp_a - Pin(self, 'inp_2').conn = self.and_.inp_b - - else: # n >= 4 - nb = n / 2 - na = n - nb - - AND_N(self, na, 'and_na', latency) - new_pin_conn(self, self.and_na, 0) - self.and_na.out.conn = self.and_.inp_a - - AND_N(self, nb, 'and_nb', latency) - new_pin_conn(self, self.and_nb, na) - self.and_nb.out.conn = self.and_.inp_b + new_pin_n( n, self, 'inp' ) + + NOTSet(self, n, 'not_set', latency) + conn2_n( n, (self, 'inp', 0), (self.not_set, 'inp', 0) ) + + OR_N(self, n, 'or_n', latency) + conn2_n( n, (self.not_set, 'out', 0), (self.or_n, 'inp', 0) ) - self.and_.out.conn = Pin(self, 'out') + NOT(self, 'not_', latency) + self.or_n.out.conn = self.not_.inp + self.not_.out.conn = Pin(self, 'out') class OR_N(Obj): # inp_x, out def __init__(self, parent, n, name='or_n', latency=10): Obj.__init__(self, parent, name) - self.n = n - OR(self, 'or_', latency) - if n == 2: - Pin(self, 'inp_0').conn = self.or_.inp_a - Pin(self, 'inp_1').conn = self.or_.inp_b - - elif n == 3: - OR_N(self, 2, 'or_n', latency) - new_pin_conn(self, self.or_n, 0) - self.or_n.out.conn = self.or_.inp_a - Pin(self, 'inp_2').conn = self.or_.inp_b - - else: # n >= 4 - nb = n / 2 - na = n - nb - - OR_N(self, na, 'or_na', latency) - new_pin_conn(self, self.or_na, 0) - self.or_na.out.conn = self.or_.inp_a - - OR_N(self, nb, 'or_nb', latency) - new_pin_conn(self, self.or_nb, na) - self.or_nb.out.conn = self.or_.inp_b - - self.or_.out.conn = Pin(self, 'out') + Joint(self, 'jt', latency).new_pin().conn = Pin(self, 'out') + for i in range(n): + Pin( self, name_i('inp', i) ).conn = self.jt.new_pin() class NAND_N(Obj): # inp_x, out @@ -472,6 +436,15 @@ Obj.__init__(self, parent, name) self.n = n new_pin_n(n, self, 'p', 0, dlst) + +class NOTSet(Obj): + # inp_x, out_x + def __init__(self, parent, n, name='not_set', latency=10): + Obj.__init__(self, parent, name) + for i in range(n): + not_ = NOT(self, name_i('not', i), latency) + Pin( self, name_i('inp', i) ).conn = not_.inp + not_.out.conn = Pin( self, name_i('out', i) ) class ANDSet(Obj): # inp_x, sel_x, out_x