--- nand.py- +++ nand.py @@ -357,17 +357,17 @@ self.jkff.Q.conn = Pin(self, 'Q') self.jkff.nQ.conn = Pin(self, 'nQ') -class DFF_N(Obj): - # D_x, CLK, Q_x - def __init__(self, parent, n, name='dff_n', latency=10): +class LATCH(Obj): + # inp_x, CLK, out_x + def __init__(self, parent, n, name='latch', latency=10): Obj.__init__(self, parent, name) self.n = n Pin(self, 'CLK', 'L').conn = Joint(self, 'jt_clk').new_pin() for i in range(n): dff_i = DFF( self, name_i('dff', i), latency ) self.jt_clk.new_pin().conn = dff_i.CLK - Pin( self, name_i('D', i), 'L' ).conn = dff_i.D - dff_i.Q.conn = Pin( self, name_i('Q', i), 'L' ) + Pin( self, name_i('inp', i), 'L' ).conn = dff_i.D + dff_i.Q.conn = Pin( self, name_i('out', i), 'L' ) class COUNTER(Obj): # CLK, out_x @@ -546,22 +546,29 @@ conn2_n( dbit_n, (self.pin_set, 'p', i * dbit_n), ( self.mux, name_i('inp', i), 0 ) ) class CLK(Obj): - # en, out - def __init__(self, parent, hz=1.0, name='clk', pos=(0,0), lamp_name=None): + # en, out, Q, nQ + def __init__(self, parent, hz=1.0, name='clk', pos=(0,0), lamp_name=None, latency=10): Obj.__init__(self, parent, name, None, pos) - latency = tm_from_fsec( 1.0 / ( 2 * hz ) ) - NAND(self, 'nand', latency) + late = tm_from_fsec( 1.0 / ( 2 * hz ) ) + NAND(self, 'nand', late) Joint(self) - AND(self, 'and_') + NOT(self, 'not_', latency) Pin(self, 'en', 'L').conn = Joint(self, 'jt_en').new_pin() self.jt_en.new_pin().conn = self.nand.inp_a self.nand.out.conn = self.jt.new_pin() self.jt.new_pin().conn = self.nand.inp_b - self.jt.new_pin().conn = self.and_.inp_b - self.jt_en.new_pin().conn = self.and_.inp_a - self.and_.out.conn = Joint(self, 'jt_out').new_pin() + self.jt.new_pin().conn = self.not_.inp + + GATE(self, 2, 'gate', latency) + self.jt_en.new_pin().conn = self.gate.en + self.jt.new_pin().conn = self.gate.inp_0 + self.not_.out.conn = self.gate.inp_1 + + self.gate.out_1.conn = Pin(self, 'nQ') + self.gate.out_0.conn = Joint(self, 'jt_out').new_pin() self.jt_out.new_pin().conn = Pin(self, 'out') + self.jt_out.new_pin().conn = Pin(self, 'Q') if lamp_name: self.jt_out.new_pin().conn = Lamp(self, lamp_name).inp @@ -717,6 +724,11 @@ self.que = [] self.now = tm_tup(0) + def enque_just(self, f, *args): + d = time.time() - self.start - tm_fsec( self.now ) + tm = tm_from_fsec( d if d > 0 else 0 ) + self.enque(tm, f, *args) + def enque(self, latency, f, *args): if len(args) == 1 and type( args[0] ) == tuple: args = args[0] @@ -727,6 +739,8 @@ if self.exist_same(t): return + for a in self.get_same_tm_f(t): + self.que.remove(a) n = len(self.que) while n > 0: @@ -739,9 +753,13 @@ def exist_same(self, t): return next( ( True for a in self.que if a == t ), False ) + def get_same_tm_f(self, t): + same_tm_f = lambda (a_tm, a_f, a_a), (t_tm, t_f, t_a): a_tm == t_tm and a_f == t_f + return [ a for a in self.que if same_tm_f(a, t) ] + def main_loop(self): self.run = True - start = time.time() + self.start = time.time() while self.run: cmd_exec( sys.stdin ) if self.que: @@ -749,7 +767,7 @@ (tm, f, args) = self.que.pop(0) self.now = tm if '-f' not in sys.argv: - tm_sleep(tm, start) + tm_sleep(tm, self.start) f(*args) else: time.sleep(0.5)