class VCDWriter:
def __init__(self, filename):
self.filename = filename
- self.buffer_file = tempfile.TemporaryFile(
- dir=os.path.dirname(filename), mode="w+")
+ self.out_file = open(self.filename, "w")
self.codegen = vcd_codes()
self.codes = OrderedDict()
self.signal_values = dict()
fmtstr = "b{:0" + str(l) + "b} {}\n"
else:
fmtstr = "{}{}\n"
- try:
- code = self.codes[signal]
- except KeyError:
- code = next(self.codegen)
- self.codes[signal] = code
+ code = self.codes[signal]
f.write(fmtstr.format(value, code))
+ def init(self, signals):
+ # generate codes
+ for signal in signals:
+ try:
+ code = self.codes[signal]
+ except KeyError:
+ code = next(self.codegen)
+ self.codes[signal] = code
+
+ # write vcd header
+ out = self.out_file
+ ns = build_namespace(self.codes.keys())
+ for signal, code in self.codes.items():
+ name = ns.get_name(signal)
+ out.write("$var wire {len} {code} {name} $end\n"
+ .format(name=name, code=code, len=len(signal)))
+ out.write("$dumpvars\n")
+ for signal in self.codes.keys():
+ self._write_value(out, signal, signal.reset.value)
+ out.write("$end\n")
+ out.write("#0\n")
+
def set(self, signal, value):
if (signal not in self.signal_values
or self.signal_values[signal] != value):
- self._write_value(self.buffer_file, signal, value)
+ self._write_value(self.out_file, signal, value)
self.signal_values[signal] = value
def delay(self, delay):
self.t += delay
- self.buffer_file.write("#{}\n".format(self.t))
+ self.out_file.write("#{}\n".format(self.t))
def close(self):
- out = open(self.filename, "w")
- try:
- ns = build_namespace(self.codes.keys())
- for signal, code in self.codes.items():
- name = ns.get_name(signal)
- out.write("$var wire {len} {code} {name} $end\n"
- .format(name=name, code=code, len=len(signal)))
- out.write("$dumpvars\n")
- for signal in self.codes.keys():
- self._write_value(out, signal, signal.reset.value)
- out.write("$end\n")
- out.write("#0\n")
-
- self.buffer_file.seek(0)
- shutil.copyfileobj(self.buffer_file, out)
- self.buffer_file.close()
- finally:
- out.close()
+ self.out_file.close()
class DummyVCDWriter:
+ def init(self):
+ pass
+
def set(self, signal, value):
pass