--- nand.py- +++ nand.py @@ -3,9 +3,10 @@ import sys class Obj: - def __init__(self, parent, name): + def __init__(self, parent, name, latency=None): self.parent = parent self.name = name + self.latency = latency if parent: setattr(parent, name, self) @@ -17,6 +18,9 @@ pa = self.parent.get_name() + '.' if self.parent else '' return pa + me + def enque(self, f, args=() ): + sched.enque(self.latency, f, args) + class Pin(Obj): def __init__(self, parent, name, direc='IO', v=None): Obj.__init__(self, parent, name) @@ -37,28 +41,39 @@ if 'O' in self.direc and self.conn: self.conn.set(v) if 'I' in self.direc and self.parent and hasattr(self.parent, 'update'): - sched.enque(None, self.parent.update) + self.enque(self.parent.update) class Foo(Obj): def __init__(self, parent, latency=None): - Obj.__init__(self, parent, 'foo') - self.latency = latency + Obj.__init__(self, parent, 'foo', latency) self.v = 0 Pin(self, 'inp', 'I') Pin(self, 'out', 'O') - sched.enque( latency, self.add, (0, ) ) + self.enque( self.add, (0, ) ) def add(self, a): self.v += a self.dbgout( 'v={}'.format(self.v) ) if self.v < 55: - sched.enque( self.latency, self.add, (a+1,) ) + self.enque( self.add, (a+1,) ) def update(self): v = not self.inp.v - sched.enque( self.latency, self.out.set, (v,) ) + self.enque( self.out.set, (v,) ) + +class NAND(Obj): + def __init__(self, parent, name='nand', latency=10): + Obj.__init__(self, parent, name, latency) + Pin(self, 'out', 'O') + Pin(self, 'inp_a', 'I') + Pin(self, 'inp_b', 'I') + + def update(self): + self.dbgout('update') + v = not ( self.inp_a.v and self.inp_b.v ) + self.enque( self.out.set, (v,) ) class Sched: def __init__(self): @@ -70,6 +85,10 @@ if latency: tm = tm + latency t = (tm, f, args) + + if self.exist_same(t): + return + n = len(self.que) while n > 0: (tm_n, _, _) = self.que[ n - 1 ] @@ -78,6 +97,9 @@ n -= 1 self.que.insert(n, t) + def exist_same(self, t): + return next( ( True for a in self.que if a == t ), False ) + def main_loop(self): while len(self.que) > 0: (tm, f, args) = self.que.pop(0) @@ -108,6 +130,13 @@ o.slow.foo.out.connect( o.slow_12.foo.inp ) sched.enque( 200, o.foo.out.set, (True,) ) + NAND(o) + sched.enque( 300, o.nand.inp_a.set, (False,) ) + sched.enque( 300, o.nand.inp_b.set, (False,) ) + sched.enque( 320, o.nand.inp_a.set, (True,) ) + sched.enque( 340, o.nand.inp_b.set, (True,) ) + sched.enque( 360, o.nand.inp_a.set, (False,) ) + sched.main_loop() # EOF