add code comments for ioring-to-niolib conversion of JSON pinspec files
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 9 Nov 2020 12:00:04 +0000 (12:00 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 9 Nov 2020 12:00:04 +0000 (12:00 +0000)
experiments9/doDesign.py

index 13535f3a05a994b10388b175008fa45fd1945532..3f847f0d049598583a7253be0a210947b080428f 100644 (file)
@@ -15,7 +15,7 @@ import plugins
 from   Hurricane  import DbU
 if True: # change this to False to get errors to "go away" so that
          # print / debug statements in generation of spec can be seen
-         # without the critical dependence of having to run via "cgt"
+         # without the hard dependence of having to run via "cgt"
     from   plugins.alpha.block.configuration import IoPin
     from   plugins.alpha.block.block         import Block
     from   plugins.alpha.block.configuration import GaugeConf
@@ -26,7 +26,8 @@ if True: # change this to False to get errors to "go away" so that
 
 af = CRL.AllianceFramework.get()
 
-
+# converts unicode strings to utf-8 because coriolis2 python code is expecting
+# str not unicode
 def _byteify(data, ignore_dicts = False):
     # if this is a unicode string, return its string representation
     if isinstance(data, unicode):
@@ -64,6 +65,20 @@ chip.update({ 'pads.ioPadGauge' : 'niolib',
           'chip.clockTree'  : True,
        })
 
+# this function is the equivalent of statically-declared io pad specs.
+# it is not ok to have io declared manually, duplicated in (literally) 5
+# different places, too many mistakes can be made and changes are a
+# nightmare.
+#
+# therefore the pinmux code takes responsibility for declaring the pinouts,
+# generates a JSON file which is read (above) and *creates* the list from
+# that auto-generated file.  the core, litex peripheral code, *and* the C4M
+# JTAG Boundary Scan code do *EXACTLY* the same thing and in this way they
+# all "match".
+#
+# here we do some weirdness to convert from the ioring.py pads list format over
+# to the new niolib format.
+
 def generate_spec():
     # convert old ioring format to ioPadsSpec
     ioPadsSpec = []
@@ -80,19 +95,26 @@ def generate_spec():
         #    sides[side] = {}
         for pinname in chip[side]:
             sides[pinname] = io_pin_spec
+
     # now go through pads.instances
     pprint (sides)
     for pad in chip['pads.instances']:
         padname = pad[0]
         padside = sides[padname]
         print ("padside", padname, padside)
+
+        # format here is ['padname', 'to core', 'from core', 'direction']
+        # where direction is "+" for out, "-" for in, "*" for bi-directionaly
         if len(pad) == 4:
+            print("4-long io", pad)
             if pad[-1] == '-':
                 en_sig = 'io_in'
             if pad[-1] == '+':
                 en_sig = 'io_out'
             padspec = [padside, None, padname, pad[1], pad[2], en_sig]
-            print("4-long io", pad)
+
+        # format here is:
+        # ['padname', 'something', 'to core', 'from core', 'en', 'direction']
         elif len(pad) == 6:
             print("6-long io", pad)
             padspec = [padside, None, padname] + pad[1:5]
@@ -101,6 +123,7 @@ def generate_spec():
             assert False
         print ("padspec", padspec)
         ioPadsSpec.append(tuple(padspec))
+
     return ioPadsSpec
 
 ioPadsSpec = generate_spec()