--- nand.py- +++ nand.py @@ -52,6 +52,7 @@ self.enque(self.parent.update) class NAND(Obj): + # inp_a, inp_b, out def __init__(self, parent, name='nand', latency=10): Obj.__init__(self, parent, name, latency) Pin(self, 'out') @@ -85,6 +86,10 @@ if pin.conn: pin.set(v) + def new_pin_conn_n(self, n, targ, name, sta_i): + for i in range(n): + self.new_pin().conn = getattr( targ, name_i(name, sta_i + i) ) + class Joint_N(Obj): def __init__(self, parent, n, name='jt_n', latency=None, pos=(0,0), slide=('y',1), lamp_name=None): Obj.__init__(self, parent, name, latency, pos) @@ -95,11 +100,11 @@ Joint( self, name_i('jt', i), latency, pos, lamp_nm ) pos = step_pos_slide(pos, slide) - def new_pin_conn(self, targ, targ_pin_name, n=-1, direc='to_targ'): + def new_pin_conn(self, targ, targ_pin_name, sta_i=0, n=-1, direc='to_targ'): if n < 0: n = self.n for i in range(n): - targ_pin = getattr( targ, name_i(targ_pin_name, i), None ) + targ_pin = getattr( targ, name_i(targ_pin_name, sta_i + i), None ) jt = getattr( self, name_i('jt', i), None ) if targ_pin and jt: if direc == 'to_targ': @@ -108,6 +113,7 @@ targ_pin.conn = jt.new_pin() class NOT(Obj): + # inp, out def __init__(self, parent, name='not_', latency=10): Obj.__init__(self, parent, name) NAND(self, 'nand', latency) @@ -118,6 +124,7 @@ self.nand.out.conn = Pin(self, 'out') class AND(Obj): + # inp_a, inp_b, out def __init__(self, parent, name='and_', latency=10): Obj.__init__(self, parent, name) NAND(self, 'nand', latency) @@ -128,6 +135,7 @@ self.not_.out.conn = Pin(self, 'out') class OR(Obj): + # inp_a, inp_b, out def __init__(self, parent, name='or_', latency=10): Obj.__init__(self, parent, name) NOT(self, 'not_a', latency) @@ -140,6 +148,7 @@ self.nand.out.conn = Pin(self, 'out') class NOR(Obj): + # inp_a, inp_b, out def __init__(self, parent, name='nor', latency=10): Obj.__init__(self, parent, name) OR(self, 'or_', latency) @@ -150,6 +159,7 @@ self.not_.out.conn = Pin(self, 'out') class XOR(Obj): + # inp_a, inp_b, out def __init__(self, parent, name='xor', latency=10): Obj.__init__(self, parent, name) NAND(self, 'nand_i', latency) @@ -177,6 +187,7 @@ self.nand_o.out.conn = Pin(self, 'out') class AND_N(Obj): + # inp_x, out def __init__(self, parent, n, name='and_n', latency=10): Obj.__init__(self, parent, name) self.n = n @@ -206,6 +217,7 @@ self.and_.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 @@ -235,6 +247,7 @@ self.or_.out.conn = Pin(self, 'out') class NAND_N(Obj): + # inp_x, out def __init__(self, parent, n, name='nand_n', latency=10): Obj.__init__(self, parent, name) self.n = n @@ -245,6 +258,7 @@ self.not_.out.conn = Pin(self, 'out') class NOR_N(Obj): + # inp_x, out def __init__(self, parent, n, name='nor_n', latency=10): Obj.__init__(self, parent, name) self.n = n @@ -255,6 +269,7 @@ self.not_.out.conn = Pin(self, 'out') class RSFF(Obj): + # R, S, Q, nQ def __init__(self, parent, name='rsff', latency=10): Obj.__init__(self, parent, name) NAND(self, 'nand_r', latency) @@ -275,6 +290,7 @@ self.nand_s.out.enque_set('H') class JKFF(Obj): + # J, K, CLK, Q, nQ def __init__(self, parent, name='jkff', latency=10): Obj.__init__(self, parent, name) RSFF(self, 'rsff_o', latency) @@ -318,6 +334,7 @@ self.jt_k_o.new_pin().conn = Pin(self, 'nQ') class TFF(Obj): + # CLK, Q, nQ def __init__(self, parent, name='tff', latency=10): Obj.__init__(self, parent, name) JKFF(self, 'jkff', latency) @@ -328,6 +345,7 @@ self.jkff.nQ.conn = Pin(self, 'nQ') class DFF(Obj): + # D, CLK, Q, nQ def __init__(self, parent, name='dff', latency=10): Obj.__init__(self, parent, name) JKFF(self, 'jkff', latency) @@ -375,7 +393,7 @@ 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', bn1, direc='from_targ') + 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') @@ -454,13 +472,13 @@ self.n = dbit_n Pin(self, 'en', 'L').conn = Joint(self, 'jt_en').new_pin() new_pin_n(abit_n, self, 'A', 0, 'L') - Joint_N(self, abit_n, 'jt_n_A').new_pin_conn(self, 'A', abit_n, 'from_targ') + Joint_N(self, abit_n, 'jt_n_A').new_pin_conn(self, 'A', 0, abit_n, 'from_targ') for i in range(dbit_n): dlst_i = [ (d >> i) & 1 for d in dlst ] rom_b = ROM_D1(self, abit_n, dlst_i, name_i('rom_b', i), latency) self.jt_en.new_pin().conn = rom_b.en - self.jt_n_A.new_pin_conn(rom_b, 'A', abit_n, 'to_targ') + self.jt_n_A.new_pin_conn(rom_b, 'A', 0, abit_n, 'to_targ') rom_b.D_0.conn = Pin( self, name_i('D', i), 'L' ) class CLK(Obj): @@ -470,7 +488,7 @@ latency = tm_from_fsec( 1.0 / ( 2 * hz ) ) NAND(self, 'nand', latency) Joint(self) - AND(self) + AND(self, 'and_') Pin(self, 'en', 'L').conn = Joint(self, 'jt_en').new_pin() self.jt_en.new_pin().conn = self.nand.inp_a @@ -568,6 +586,67 @@ def conn_targ(self, targ, targ_pin_name): conn2_n( 7, (self, 'out', 0), (targ, targ_pin_name, 0) ) + +class DECODER_Lamp_7seg(Obj): + # en, inp_x + def __init__(self, parent, name='deco_lamp_7seg', latency=10, pos=(0,0)): + Obj.__init__(self, parent, name) + DECODER_7seg(self, 'deco', latency) + Pin(self, 'en', 'L').conn = self.deco.en + new_pin_n(4, self, 'inp', 0, 'L') + conn2_n(4, (self, 'inp', 0), (self.deco, 'inp', 0) ) + + Lamp_7seg(self, 'lamp', latency, pos) + conn2_n(7, (self.deco, 'out', 0), (self.lamp, 'inp', 0) ) + +class ADD(Obj): + # A, B, Y, C + def __init__(self, parent, name='add', latency=10): + Obj.__init__(self, parent, name) + + Pin(self, 'A', 'L').conn = Joint(self, 'jt_a').new_pin() + Pin(self, 'B', 'L').conn = Joint(self, 'jt_b').new_pin() + + XOR(self, 'xor', latency).out.conn = Pin(self, 'Y', 'L') + self.jt_a.new_pin().conn = self.xor.inp_a + self.jt_b.new_pin().conn = self.xor.inp_b + + AND(self, 'and_', latency).out.conn = Pin(self, 'C', 'L') + self.jt_a.new_pin().conn = self.and_.inp_a + self.jt_b.new_pin().conn = self.and_.inp_b + +class ADD_C(Obj): + # Cin, A, B, Y, C + def __init__(self, parent, name='add_c', latency=10): + Obj.__init__(self, parent, name) + + ADD(self, 'add_ab', latency) + Pin(self, 'A', 'L').conn = self.add_ab.A + Pin(self, 'B', 'L').conn = self.add_ab.B + + ADD(self, 'add_cy', latency) + Pin(self, 'Cin', 'L').conn = self.add_cy.A + self.add_ab.Y.conn = self.add_cy.B + self.add_cy.Y.conn = Pin(self, 'Y', 'L') + + OR(self, 'or_', latency).out.conn = Pin(self, 'C', 'L') + self.add_cy.C.conn = self.or_.inp_a + self.add_ab.C.conn = self.or_.inp_b + +class ADD_N(Obj): + # Cin, A_x, B_x, Y_x, C + def __init__(self, parent, n, name='add_n', latency=10): + Obj.__init__(self, parent, name) + self.n = n + c = Pin(self, 'Cin', 'L') + for i in range(n): + add_c = ADD_C( self, name_i('add_c', i), latency ) + c.conn = add_c.Cin + Pin( self, name_i('A', i), 'L' ).conn = add_c.A + Pin( self, name_i('B', i), 'L' ).conn = add_c.B + add_c.Y.conn = Pin( self, name_i('Y', i), 'L' ) + c = add_c.C + c.conn = Pin(self, 'C', 'L') class Sched: def __init__(self):