--- nand.py- +++ nand.py @@ -619,45 +619,9 @@ # en def __init__(self, parent, abit_n, dlst=(), name='ram_test_4', hz=1.0, pos=(0,0), latency=10): Obj.__init__(self, parent, name, None, pos) - - Pin(self, 'en').conn = Joint(self, 'jt_en').new_pin() - - (x,y) = (0,0) - ROM_SEQ(self, 8, abit_n, dlst, 'rom_seq', hz, (x,y), 'CLK', latency) - self.jt_en.new_pin().conn = self.rom_seq.en - x += 10 - Joint_N(self, 4, 'jt_d', None, (x,y), ('y',1), 'D') - self.jt_d.new_pin_conn(self.rom_seq, 'out', direc='from_targ') - y += 4+1 - Joint_N(self, 3, 'jt_a', None, (x,y), ('y',1), 'A') - self.jt_a.new_pin_conn(self.rom_seq, 'out', 4, direc='from_targ') - y += 3+1 - self.rom_seq.out_7.conn = Joint(self, 'jt_ctl', None, (x,y), 'CTL').new_pin() - self.rom_seq.nQ.conn = Joint(self, 'jt_nQ').new_pin() - y_bak = y - RAM(self, 4, 3, 'ram', latency) - self.jt_en.new_pin().conn = self.ram.en - self.jt_d.new_pin_conn(self.ram, 'inp', direc='to_targ') - self.jt_a.new_pin_conn(self.ram, 'A', direc='to_targ') - - x += 10 - y = 0 - x_bak = x - Joint_N(self, 4, 'jt_ram_out', None, (x,y), ('y',1), 'O') - self.jt_ram_out.new_pin_conn(self.ram, 'out', direc='from_targ') - - DECODER_Lamp_7seg(self, 'deco_lamp_7seg', latency, (40,0)) - self.jt_en.new_pin().conn = self.deco_lamp_7seg.en - self.jt_ram_out.new_pin_conn(self.deco_lamp_7seg, 'inp', direc='to_targ') - - x = x_bak - y = y_bak - AND(self, 'and_w', latency) - self.jt_ctl.new_pin().conn = self.and_w.inp_a - self.jt_nQ.new_pin().conn = self.and_w.inp_b - self.and_w.out.conn = Joint(self, 'jt_wrt', None, (x,y), 'W').new_pin() - self.jt_wrt.new_pin().conn = self.ram.CLK + DEV_TEST_4(self, self.ram, abit_n, dlst, 'dev_test_4', hz, (0,0), latency) + Pin(self, 'en').conn = self.dev_test_4.en class CLK(Obj): # en, out, Q, nQ @@ -832,6 +796,82 @@ c = add_c.C c.conn = Pin(self, 'C') +class ADD_DEV(Obj): + # en, CLK, A_0, D_x + def __init__(self, parent, dbit_n, name='add_dev', latency=10): + Obj.__init__(self, parent, name) + + LATCH_N(self, 2, dbit_n, 'latch_2', latency) + ADD_N(self, dbit_n, 'add_n', latency) + MUX(self, dbit_n, 1, 'mux', latency) + + Pin(self, 'CLK').conn = self.latch_2.CLK + Pin(self, 'en').conn = self.mux.en + Pin(self, 'A_0').conn = self.mux.A_0 + + self.mux.deco_out_0.conn = self.latch_2.sel_0 + self.mux.deco_out_1.conn = self.latch_2.sel_1 + + new_pin_n(dbit_n, self, 'inp') + conn2_n( dbit_n, (self, 'inp', 0), (self.latch_2, 'inp', 0) ) + conn2_n( dbit_n, (self.latch_2, 'out_0', 0), (self.add_n, 'A', 0) ) + conn2_n( dbit_n, (self.latch_2, 'out_1', 0), (self.add_n, 'B', 0) ) + conn2_n( dbit_n, (self.add_n, 'Y', 0), (self.mux, 'inp_0', 0) ) + self.add_n.C.conn = self.mux.inp_1_0 + new_pin_n(dbit_n, self, 'out') + conn2_n( dbit_n, (self.mux, 'out', 0), (self, 'out', 0) ) + +class DEV_TEST_4(Obj): + # en + + def __init__(self, parent, dev, abit_n, dlst=(), name='dev_test_4', hz=1.0, pos=(0,0), latency=10): + + # dev : dbit_n <= 4, abit_n <= 3 + + Obj.__init__(self, parent, name, None, pos) + + Pin(self, 'en').conn = Joint(self, 'jt_en').new_pin() + + (x,y) = (0,0) + ROM_SEQ(self, 8, abit_n, dlst, 'rom_seq', hz, (x,y), 'CLK', latency) + self.jt_en.new_pin().conn = self.rom_seq.en + x += 10 + Joint_N(self, 4, 'jt_d', None, (x,y), ('y',1), 'D') + self.jt_d.new_pin_conn(self.rom_seq, 'out', direc='from_targ') + y += 4+1 + Joint_N(self, 3, 'jt_a', None, (x,y), ('y',1), 'A') + self.jt_a.new_pin_conn(self.rom_seq, 'out', 4, direc='from_targ') + y += 3+1 + self.rom_seq.out_7.conn = Joint(self, 'jt_ctl', None, (x,y), 'CTL').new_pin() + self.rom_seq.nQ.conn = Joint(self, 'jt_nQ').new_pin() + y_bak = y + + self.dev = dev + dev_dbit_n = min( 4, get_num(dev, 'inp') ) + dev_abit_n = min( 3, get_num(dev, 'A') ) + + self.jt_en.new_pin().conn = self.dev.en + self.jt_d.new_pin_conn(self.dev, 'inp', n=dev_dbit_n, direc='to_targ') + self.jt_a.new_pin_conn(self.dev, 'A', n=dev_abit_n, direc='to_targ') + + x += 10 + y = 0 + x_bak = x + Joint_N(self, 4, 'jt_dev_out', None, (x,y), ('y',1), 'O') + self.jt_dev_out.new_pin_conn(self.dev, 'out', direc='from_targ') + + DECODER_Lamp_7seg(self, 'deco_lamp_7seg', latency, (40,0)) + self.jt_en.new_pin().conn = self.deco_lamp_7seg.en + self.jt_dev_out.new_pin_conn(self.deco_lamp_7seg, 'inp', direc='to_targ') + + x = x_bak + y = y_bak + AND(self, 'and_w', latency) + self.jt_ctl.new_pin().conn = self.and_w.inp_a + self.jt_nQ.new_pin().conn = self.and_w.inp_b + self.and_w.out.conn = Joint(self, 'jt_wrt', None, (x,y), 'W').new_pin() + self.jt_wrt.new_pin().conn = self.dev.CLK + class Sched: def __init__(self): self.que = [] @@ -930,6 +970,12 @@ return dlst # same v return dlst[i] if i < len(dlst) else -1 +def get_num(obj, name, sta_i=0): + i = sta_i + while hasattr( obj, name_i(name, i) ): + i += 1 + return i + def name_i(name, i): return '{}_{}'.format(name, i)