--- nand.py- +++ nand.py @@ -143,6 +143,84 @@ self.nand_b.out.conn = self.nand_o.inp_b self.nand_o.out.conn = Pin(self, 'out') +class AND_N(Obj): + 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 + + sef.and_.out.conn = Pin(self, 'out') + +class OR_N(Obj): + 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 + + sef.or_.out.conn = Pin(self, 'out') + +class NAND_N(Obj): + def __init__(self, parent, n, name='nand_n', latency=10): + Obj.__init__(self, parent, name) + self.n = n + AND_N(self, 'and_n', latency) + new_pin_conn(self, self.and_n, 0) + NOT(self, 'not_', latency) + self.and_n.out.conn = self.not_.inp + self.not_.out.conn = Pin(self, 'out') + +class NOR_N(Obj): + def __init__(self, parent, n, name='nor_n', latency=10): + Obj.__init__(self, parent, name) + self.n = n + OR_N(self, 'or_n', latency) + new_pin_conn(self, self.or_n, 0) + NOT(self, 'not_', latency) + self.or_n.out.conn = self.not_.inp + self.not_.out.conn = Pin(self, 'out') + class RSFF(Obj): def __init__(self, parent, name='rsff', latency=10): Obj.__init__(self, parent, name) @@ -238,6 +316,14 @@ dbgout( 'cmd_exec "{}"'.format(s) ) exec s +def new_pin_conn(obj, in_obj, sta_i): + for i in range(in_obj.n): + pin = getattr( in_obj, name_inp(i) ) + Pin( obj, name_inp( sta_i + i ) ).conn = pin + +def name_inp(i): + return 'inp_{}'.format(i) + def str_v(v): return { True: 'H', False: 'L', None: 'Hi-Z' }.get(v, '?')