--- nand.py- +++ nand.py @@ -340,6 +340,7 @@ self.jkff.nQ.conn = Pin(self, 'nQ') class COUNTER(Obj): + # CLK, out_x def __init__(self, parent, bit_n, name='counter', latency=10): Obj.__init__(self, parent, name) self.n = bit_n @@ -351,6 +352,7 @@ clk = tff.nQ class DECODER(Obj): + # en, inp_x, out_x def __init__(self, parent, bit_n, name='decoder', latency=10): Obj.__init__(self, parent, name) self.n = bit_n @@ -388,60 +390,70 @@ 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') +class PinSet(Obj): + # p_x + def __init__(self, parent, n, dlst=(), name='pin_set'): + Obj.__init__(self, parent, name) + self.n = n + new_pin_n(n, self, 'p', 0, dlst) + +class ANDSet(Obj): + # inp_x, sel_x, out_x + def __init__(self, parent, n, name='and_set', latency=10): + Obj.__init__(self, parent, name) + self.n = n + for i in range(n): + and_i = AND( self, name_i('and', i), latency ) + Pin( self, name_i('inp', i) ).conn = and_i.inp_a + Pin( self, name_i('sel', i) ).conn = and_i.inp_b + and_i.out.conn = Pin( self, name_i('out', i) ) + +class SELECTOR(Obj): + # en, A_x, D_x, out + def __init__(self, parent, bit_n, name='selector', latency=10): + Obj.__init__(self, parent, name) + self.n = bit_n + new_pin_n(bit_n, self, 'A', 0, 'L') + DECODER(self, bit_n, 'deco', latency) + conn2_n( bit_n, (self, 'A', 0), (self.deco, 'inp', 0) ) + Pin(self, 'en', 'L').conn = self.deco.en + + dn = 1 << bit_n + new_pin_n(dn, self, 'D', 0, 'L') + ANDSet(self, dn, 'and_set', latency) + conn2_n( dn, (self, 'D', 0), (self.and_set, 'inp', 0) ) + conn2_n( dn, (self.deco, 'out', 0), (self.and_set, 'sel', 0) ) + + OR_N(self, dn, 'or_n', latency) + conn2_n( dn, (self.and_set, 'out', 0), (self.or_n, 'inp', 0) ) + self.or_n.out.conn = Pin(self, 'out', 'L') + class ROM_D1(Obj): + # en, A_x, D_0 def __init__(self, parent, abit_n, dlst=(), name='rom_d1', latency=10): Obj.__init__(self, parent, name) self.dbgout(dlst) self.n = abit_n - for i in range(abit_n): - Pin( self, name_i('A', i), 'L' ) - n1 = abit_n - 1 - msb = getattr( self, name_i('A', n1) ) - msb.conn = DECODER(self, 1, 'deco', latency).inp_0 - - if abit_n == 1: - dlst_v = lambda i: dlst[i] if i < len(dlst) else -1 - dlst_b = lambda i: bool( dlst_v(i) & 1 ) - Pin(self, 'p0', dlst_b(0) ).conn = AND(self, 'and_d', latency).inp_a - Pin(self, 'p1', dlst_b(1) ).conn = AND(self, 'and_u', latency).inp_a - - en_d = self.and_d.inp_b - en_u = self.and_u.inp_b - out_d = self.and_d.out - out_u = self.and_u.out - else: - half = 1 << n1 - ROM_D1(self, n1, dlst[ :half ], 'rom_d', latency) - ROM_D1(self, n1, dlst[ half: ], 'rom_u', latency) - Joint_N(self, n1, 'jt_n') - self.jt_n.new_pin_conn(self.rom_d, 'A') - self.jt_n.new_pin_conn(self.rom_u, 'A') - self.jt_n.new_pin_conn(self, 'A', n1, direc='from_targ') - - en_d = self.rom_d.en - en_u = self.rom_u.en - out_d = self.rom_d.D_0 - out_u = self.rom_u.D_0 - - self.deco.out_0.conn = en_d - self.deco.out_1.conn = en_u - - OR(self, 'or_', latency).out.conn = AND(self, 'and_out', latency).inp_a - out_d.conn = self.or_.inp_a - out_u.conn = self.or_.inp_b - - Pin(self, 'en', 'L').conn = Joint(self, 'jt').new_pin() - self.jt.new_pin().conn = self.deco.en - self.jt.new_pin().conn = self.and_out.inp_b - self.and_out.out.conn = Pin(self, 'D_0', 'L') + dn = 1 << abit_n + + SELECTOR(self, abit_n, 'select', latency) + + Pin(self, 'en', 'L').conn = self.select.en + new_pin_n(abit_n, self, 'A', 0, 'L') + conn2_n( abit_n, (self, 'A', 0), (self.select, 'A', 0) ) + self.select.out.conn = Pin(self, 'D_0', 'L') + + # as late as possible, for data enque + PinSet(self, dn, dlst, 'pin_set') + conn2_n( dn, (self.pin_set, 'p', 0), (self.select, 'D', 0) ) class ROM(Obj): + # en, A_x, D_x def __init__(self, parent, dbit_n, abit_n, dlst=(), name='rom', latency=10): Obj.__init__(self, parent, name) self.n = dbit_n Pin(self, 'en', 'L').conn = Joint(self, 'jt_en').new_pin() - for i in range(abit_n): - Pin( self, name_i('A', i), 'L' ) + 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') for i in range(dbit_n): @@ -452,6 +464,7 @@ rom_b.D_0.conn = Pin( self, name_i('D', i), 'L' ) class CLK(Obj): + # en, out def __init__(self, parent, hz=1.0, name='clk', pos=(0,0), lamp_name=None): Obj.__init__(self, parent, name, None, pos) latency = tm_from_fsec( 1.0 / ( 2 * hz ) ) @@ -471,6 +484,7 @@ self.jt_out.new_pin().conn = Lamp(self, lamp_name).inp class Lamp(Obj): + # inp def __init__(self, parent, name='lamp', latency=None, pos=(0,0), show_inf={}): Obj.__init__(self, parent, name, latency, pos) self.show_inf = show_inf @@ -502,6 +516,7 @@ sys.stdout.flush() class Lamp_N(Obj): + # inp_x def __init__(self, parent, n, name='lamp_n', latency=None, pos=(0,0), slide=('y',1)): Obj.__init__(self, parent, name, latency, pos) self.n = n @@ -513,9 +528,10 @@ def conn_targ(self, targ, targ_pin_name, n=-1): n = self.n if n < 0 else n - conn_n( n, targ, 0, targ_pin_name, self, 0, 'inp' ) + conn2_n( n, (targ, targ_pin_name, 0), (self, 'inp', 0) ) class Lamp_7seg(Obj): + # inp_x def __init__(self, parent, name='lamp_7seg', latency=None, pos=(0,0)): Obj.__init__(self, parent, name, None, pos) lst = [ @@ -533,9 +549,10 @@ Pin( self, name_i('inp', i), 'L' ).conn = lamp.inp def conn_targ(self, targ, targ_pin_name): - conn_n( 7, targ, 0, targ_pin_name, self, 0, 'inp' ) + conn2_n( 7, (targ, targ_pin_name, 0), (self, 'inp', 0) ) class DECODER_7seg(Obj): + # en, inp_x, out_x def __init__(self, parent, name='dec_7seg', latency=10): Obj.__init__(self, parent, name) dlst = [ @@ -544,15 +561,13 @@ ] ROM(self, 7, 4, dlst, 'rom', latency) Pin(self, 'en', 'L').conn = self.rom.en - for i in range(4): - Pin( self, name_i('inp', i), 'L' ) - conn_n(4, self, 0, 'inp', self.rom, 0, 'A') - for i in range(7): - Pin( self, name_i('out', i), 'L' ) - conn_n(7, self.rom, 0, 'D', self, 0, 'out') + new_pin_n(4, self, 'inp', 0, 'L') + conn2_n( 4, (self, 'inp', 0), (self.rom, 'A', 0) ) + new_pin_n(7, self, 'out', 0, 'L') + conn2_n( 7, (self.rom, 'D', 0), (self, 'out', 0) ) def conn_targ(self, targ, targ_pin_name): - conn_n( 7, self, 0, 'out', targ, 0, targ_pin_name ) + conn2_n( 7, (self, 'out', 0), (targ, targ_pin_name, 0) ) class Sched: def __init__(self): @@ -620,10 +635,13 @@ def new_pin_conn(obj, in_obj, sta_i, n=-1, name='inp', direc='to_in_obj'): if n < 0: n = in_obj.n - for i in range(n): - Pin( obj, name_i( name, sta_i + i ) ) + new_pin_n(n, obj, name, sta_i) direc_rev = (direc != 'to_in_obj') - conn_n(n, obj, sta_i, name, in_obj, 0, name, direc_rev) + conn2_n(n, (obj, name, sta_i), (in_obj, name, 0), direc_rev) + +def conn2_n( n, (from_obj, from_name, from_sta_i), (to_obj, to_name, to_sta_i), direc_rev=False ): + # replaced args, only ... + conn_n(n, from_obj, from_sta_i, from_name, to_obj, to_sta_i, to_name, direc_rev) def conn_n(n, from_obj, from_sta_i, from_name, to_obj, to_sta_i, to_name, direc_rev=False): for i in range(n): @@ -634,6 +652,16 @@ to_pin.conn = from_pin else: from_pin.conn = to_pin + +def new_pin_n(n, targ, name, name_sta_i=0, dlst=None): + for i in range(n): + Pin( targ, name_i(name, name_sta_i + i), get_dlst_val(i, dlst) ) + +def get_dlst_val(i, dlst): + t = type(dlst) + if t not in [ tuple, list ]: + return dlst # same v + return dlst[i] if i < len(dlst) else -1 def name_i(name, i): return '{}_{}'.format(name, i)