--- nand.py- +++ nand.py @@ -9,25 +9,57 @@ if parent: setattr(parent, name, self) + def dbgout(self, s, always=False): + dbgout( '{} {}'.format( self.get_name(), s ), always ) + def get_name(self): me = self.name if self.name else '' pa = self.parent.get_name() + '.' if self.parent else '' return pa + me +class Pin(Obj): + def __init__(self, parent, name, direc='IO', v=None): + Obj.__init__(self, parent, name) + self.direc = direc + self.v = v + self.conn = None + + def connect(self, other): + self.conn = other + if other and other.conn != self: + other.conn = self + + def set(self, v): + if v == self.v: + return + self.v = v + self.dbgout( str_v(v) ) + 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) + class Foo(Obj): def __init__(self, parent, latency=None): Obj.__init__(self, parent, 'foo') self.latency = latency self.v = 0 + + Pin(self, 'inp', 'I') + Pin(self, 'out', 'O') + sched.enque( latency, self.add, (0, ) ) def add(self, a): self.v += a - msg = '{} v={}'.format( self.get_name(), self.v ) - dbgout(msg) + self.dbgout( 'v={}'.format(self.v) ) if self.v < 55: sched.enque( self.latency, self.add, (a+1,) ) + def update(self): + v = not self.inp.v + sched.enque( self.latency, self.out.set, (v,) ) + class Sched: def __init__(self): self.que = [] @@ -52,6 +84,9 @@ self.now = tm f(*args) +def str_v(v): + return { True: 'H', False: 'L', None: 'Hi-Z' }.get(v, '?') + def dbgout(s, always=False): if always or '-v' in sys.argv: print '{} {}'.format( sched.now, s ) @@ -69,6 +104,10 @@ slow_12 = Obj(o, 'slow_12') Foo(slow_12, 12) + o.foo.out.connect( o.slow.foo.inp ) + o.slow.foo.out.connect( o.slow_12.foo.inp ) + sched.enque( 200, o.foo.out.set, (True,) ) + sched.main_loop() # EOF