--- nand.py- +++ nand.py @@ -116,12 +116,12 @@ class Sched: def __init__(self): self.que = [] - self.now = 0 + self.now = tm_tup(0) def enque(self, latency, f, args=() ): tm = self.now if latency: - tm = tm + latency + tm = tm_add( tm, tm_tup(latency) ) t = (tm, f, args) if self.exist_same(t): @@ -130,7 +130,7 @@ n = len(self.que) while n > 0: (tm_n, _, _) = self.que[ n - 1 ] - if tm >= tm_n: + if tm_gt(tm, tm_n) or tm == tm_n: break n -= 1 self.que.insert(n, t) @@ -150,9 +150,25 @@ def bool_v(v): return {'H': True, 'L': False, 'Hi-Z': None }.get(v, v) +def tm_tup(v): + return (0, v) if type(v) == int else v + +def tm_gt( (s1,n1), (s2,n2) ): + return n1 > n2 if s1 == s2 else s1 > s2 + +def tm_add( (s1,n1), (s2,n2) ): + giga = 1000000000 + n1 += n2 + s1 += s2 + n1 / giga + n1 %= giga + return (s1, n1) + +def tm_str( (s,n) ): + return '{}.{:0>9}'.format(s, n) + def dbgout(s, always=False): if always or '-v' in sys.argv: - print '{} {}'.format( sched.now, s ) + print '{} {}'.format( tm_str(sched.now), s ) sys.stdout.flush() if __name__ == "__main__": @@ -188,6 +204,8 @@ sched.enque( 400, o.test1.nand.inp_b.set, ('H',) ) sched.enque( 500, o.test1.nand.inp_b.set, ('L',) ) + sched.enque( (2,0), o.test1.lamp.inp.set, ('L',) ) + sched.main_loop() # EOF