add some debug output to Visitor2 (commented out)
[nmutil.git] / src / nmutil / nmoperator.py
index fd50d2f53e7c8292985752df7afffdefa4e04417..a5fa03bd9a21ae51cc07bf67e05d1fa7b73456e0 100644 (file)
@@ -1,5 +1,10 @@
 """ nmigen operator functions / utils
 
+    This work is funded through NLnet under Grant 2019-02-012
+
+    License: LGPLv3+
+
+
     eq:
     --
 
     Records.
 """
 
-from nmigen import Signal, Cat, Const, Mux, Module, Value, Elaboratable
-from nmigen.cli import verilog, rtlil
-from nmigen.lib.fifo import SyncFIFO, SyncFIFOBuffered
+from nmigen import Signal, Cat, Value
 from nmigen.hdl.ast import ArrayProxy
 from nmigen.hdl.rec import Record, Layout
 
 from abc import ABCMeta, abstractmethod
 from collections.abc import Sequence, Iterable
-from collections import OrderedDict
-from nmutil.queue import Queue
 import inspect
 
 
@@ -47,22 +48,30 @@ class Visitor2:
         if not isinstance(o, Sequence):
             o, i = [o], [i]
         for (ao, ai) in zip(o, i):
-            #print ("visit", fn, ao, ai)
+            # print ("visit", ao, ai)
+            # print ("    isinstance Record(ao)", isinstance(ao, Record))
+            # print ("    isinstance ArrayProxy(ao)",
+            #            isinstance(ao, ArrayProxy))
+            # print ("    isinstance Value(ai)",
+            #            isinstance(ai, Value))
             if isinstance(ao, Record):
                 yield from self.record_iter2(ao, ai)
             elif isinstance(ao, ArrayProxy) and not isinstance(ai, Value):
                 yield from self.arrayproxy_iter2(ao, ai)
+            elif isinstance(ai, ArrayProxy) and not isinstance(ao, Value):
+                assert False, "whoops, input ArrayProxy not supported yet"
+                yield from self.arrayproxy_iter3(ao, ai)
             else:
                 yield (ao, ai)
 
     def dict_iter2(self, o, i):
         for (k, v) in o.items():
-            print ("d-iter", v, i[k])
+            print ("d-iter", v, i[k])
             yield (v, i[k])
         return res
 
     def _not_quite_working_with_all_unit_tests_record_iter2(self, ao, ai):
-        print ("record_iter2", ao, ai, type(ao), type(ai))
+        print ("record_iter2", ao, ai, type(ao), type(ai))
         if isinstance(ai, Value):
             if isinstance(ao, Sequence):
                 ao, ai = [ao], [ai]
@@ -93,9 +102,16 @@ class Visitor2:
             yield from self.iterator2(ao.fields[field_name], val)
 
     def arrayproxy_iter2(self, ao, ai):
-        #print ("arrayproxy_iter2", ai.ports(), ai, ao)
+        # print ("arrayproxy_iter2", ai.ports(), ai, ao)
         for p in ai.ports():
-            #print ("arrayproxy - p", p, p.name, ao)
+            # print ("arrayproxy - p", p, p.name, ao)
+            op = getattr(ao, p.name)
+            yield from self.iterator2(op, p)
+
+    def arrayproxy_iter3(self, ao, ai):
+        # print ("arrayproxy_iter3", ao.ports(), ai, ao)
+        for p in ao.ports():
+            # print ("arrayproxy - p", p, p.name, ao)
             op = getattr(ao, p.name)
             yield from self.iterator2(op, p)