Move new write_gtkw and its example to nmutil
[soc.git] / src / soc / experiment / alu_fsm.py
index 9668535aedc8e507212906baf679dc37484b8e8d..28bbde6580a6fa8f48f6c234f343948a9196acc1 100644 (file)
@@ -29,7 +29,7 @@ from nmutil.iocontrol import PrevControl, NextControl
 from soc.fu.base_input_record import CompOpSubsetBase
 from soc.decoder.power_enums import (MicrOp, Function)
 
-from vcd.gtkw import GTKWSave, GTKWColor
+from nmutil.gtkw import write_gtkw
 
 
 class CompFSMOpSubset(CompOpSubsetBase):
@@ -205,52 +205,6 @@ class Shifter(Elaboratable):
         return list(self)
 
 
-# Write a formatted GTKWave "save" file
-def write_gtkw(base_name, top_dut_name, loc):
-    # hierarchy path, to prepend to signal names
-    dut = top_dut_name + "."
-    # color styles
-    style_input = GTKWColor.orange
-    style_output = GTKWColor.yellow
-    style_debug = GTKWColor.red
-    with open(base_name + ".gtkw", "wt") as gtkw_file:
-        gtkw = GTKWSave(gtkw_file)
-        gtkw.comment("Auto-generated by " + loc)
-        gtkw.dumpfile(base_name + ".vcd")
-        # set a reasonable zoom level
-        # also, move the marker to an interesting place
-        gtkw.zoom_markers(-22.9, 10500000)
-        gtkw.trace(dut + "clk")
-        # place a comment in the signal names panel
-        gtkw.blank("Shifter Demonstration")
-        with gtkw.group("prev port"):
-            gtkw.trace(dut + "op__sdir", color=style_input)
-            # demonstrates using decimal base (default is hex)
-            gtkw.trace(dut + "p_data_i[7:0]", color=style_input,
-                       datafmt='dec')
-            gtkw.trace(dut + "p_shift_i[7:0]", color=style_input,
-                       datafmt='dec')
-            gtkw.trace(dut + "p_valid_i", color=style_input)
-            gtkw.trace(dut + "p_ready_o", color=style_output)
-        with gtkw.group("debug"):
-            gtkw.blank("Some debug statements")
-            # change the displayed name in the panel
-            gtkw.trace("top.zero", alias='zero delay shift',
-                       color=style_debug)
-            gtkw.trace("top.interesting", color=style_debug)
-            gtkw.trace("top.test_case", alias="test case", color=style_debug)
-            gtkw.trace("top.msg", color=style_debug)
-        with gtkw.group("internal"):
-            gtkw.trace(dut + "fsm_state")
-            gtkw.trace(dut + "count[3:0]")
-            gtkw.trace(dut + "shift_reg[7:0]", datafmt='dec')
-        with gtkw.group("next port"):
-            gtkw.trace(dut + "n_data_o[7:0]", color=style_output,
-                       datafmt='dec')
-            gtkw.trace(dut + "n_valid_o", color=style_output)
-            gtkw.trace(dut + "n_ready_i", color=style_input)
-
-
 def test_shifter():
     m = Module()
     m.submodules.shf = dut = Shifter(8)
@@ -263,8 +217,63 @@ def test_shifter():
     with open("test_shifter.il", "w") as f:
         f.write(il)
 
-    # Write the GTKWave project file
-    write_gtkw("test_shifter", "top.shf", __file__)
+    # Describe a GTKWave document
+
+    # Style for signals, classes and groups
+    gtkwave_style = {
+        # Root selector. Gives default attributes for every signal.
+        '': {'base': 'dec'},
+        # color the traces, according to class
+        # class names are not hardcoded, they are just strings
+        'in': {'color': 'orange'},
+        'out': {'color': 'yellow'},
+        # signals in the debug group have a common color and module path
+        'debug': {'module': 'top', 'color': 'red'},
+        # display a different string replacing the signal name
+        'test_case': {'display': 'test case'},
+    }
+
+    # DOM style description for the trace pane
+    gtkwave_desc = [
+        # simple signal, without a class
+        # even so, it inherits the top-level root attributes
+        'clk',
+        # comment
+        {'comment': 'Shifter Demonstration'},
+        # collapsible signal group
+        ('prev port', [
+            # attach a class style for each signal
+            ('op__sdir', 'in'),
+            ('p_data_i[7:0]', 'in'),
+            ('p_shift_i[7:0]', 'in'),
+            ('p_valid_i', 'in'),
+            ('p_ready_o', 'out'),
+        ]),
+        # Signals in a signal group inherit the group attributes.
+        # In this case, a different module path and color.
+        ('debug', [
+            {'comment': 'Some debug statements'},
+            # inline attributes, instead of a class name
+            ('zero', {'display': 'zero delay shift'}),
+            'interesting',
+            'test_case',
+            'msg',
+        ]),
+        ('internal', [
+            'fsm_state',
+            'count[3:0]',
+            'shift_reg[7:0]',
+        ]),
+        ('next port', [
+            ('n_data_o[7:0]', 'out'),
+            ('n_valid_o', 'out'),
+            ('n_ready_i', 'in'),
+        ]),
+    ]
+
+    write_gtkw("test_shifter.gtkw", "test_shifter.vcd",
+               gtkwave_desc,  gtkwave_style,
+               module="top.shf", loc=__file__, marker=10500000)
 
     sim = Simulator(m)
     sim.add_clock(1e-6)