sort out JSON function missing and get mapping working
[pinmux.git] / src / pinmux_generator.py
index cff59d1cbcb0a9fd0cd7dfa93baa984c6670d8ec..febc722132d1b19734993f85a373373e220b84c4 100644 (file)
@@ -19,9 +19,9 @@
 import getopt
 import os.path
 import sys
-from spec import modules, specgen
-
-from bsv.pinmux_generator import pinmuxgen as bsvgen
+import json
+from spec import modules, specgen, dummytest
+from spec.ifaceprint import create_sv, temp_create_sv
 
 
 def printhelp():
@@ -43,13 +43,14 @@ if __name__ == '__main__':
             'o:vht:s:',
             ['output=',
              'validate',
+             'test',
              'outputtype=',
              'spec=',
              'help',
              'version=',
              ])
     except getopt.GetoptError as err:
-        print "ERROR: %s" % str(err)
+        print ("ERROR: %s" % str(err))
         printhelp()
         sys.exit(1)
 
@@ -58,6 +59,7 @@ if __name__ == '__main__':
     validate = False
     spec = None
     pinspec = None
+    testing = False
     for opt, arg in options:
         if opt in ('-o', '--output'):
             output_dir = arg
@@ -67,22 +69,58 @@ if __name__ == '__main__':
             output_type = arg
         elif opt in ('-v', '--validate'):
             validate = True
+        elif opt in ('--test',):
+            testing = True
         elif opt in ('-h', '--help'):
             printhelp()
             sys.exit(0)
 
     if pinspec:
-        if not modules.has_key(pinspec):
-            print "ERROR: spec type '%s' does not exist" % pinspec
+        if pinspec not in modules:
+            print ("ERROR: spec type '%s' does not exist" % pinspec)
             printhelp()
             sys.exit(1)
         module = modules[pinspec]
-        pinout, bankspec, fixedpins = module.pinspec()
-        specgen(output_dir, pinout, bankspec, fixedpins)
+
+        fname = os.path.join(output_dir or '', "%s.mdwn" % pinspec)
+        pyname = os.path.join(output_dir or '', "%s_pins.py" % pinspec)
+        d = os.path.split(fname)[0]
+        if not os.path.exists(d):
+            os.makedirs(d)
+        with open(fname, "w") as of:
+            with open(pyname, "w") as pyf:
+                ps = module.pinspec()
+                pinout, bankspec, pin_spec, fixedpins = ps.write(of)
+                #chip['litex.map'] = litexmap
+                if testing:
+                    dummytest(ps, output_dir, output_type)
+                else:
+                    specgen(of, output_dir, pinout,
+                            bankspec, ps.muxwidths, pin_spec, fixedpins,
+                            ps.fastbus)
+                if hasattr(module, "pinparse"):
+                    pm, chip = module.pinparse(ps, pinspec)
+                    litexmap = ps.pywrite(pyf, pm)
+                    jchip = json.dumps(chip)
+                    with open("%s/litex_pinpads.json" % pinspec, "w") as f:
+                        f.write(jchip)
+                    # octavius: please keep line-lengths to below 80 chars
+                    # TODO: fix create_sv to allow different packages
+                    # (and die images)
+                    # Test with different package size, once working
+                    # 'create_sv' will be improved
+                    if pinspec == "ngi_router":
+                        temp_create_sv("%s/%s.svg" % (pinspec, pinspec), chip)
+                    else:
+                        create_sv("%s/%s.svg" % (pinspec, pinspec), chip)
     else:
-        gentypes = {'bsv': bsvgen}
-        if not gentypes.has_key(output_type):
-            print "ERROR: output type '%s' does not exist" % output_type
+        if output_type == 'bsv':
+            from bsv.pinmux_generator import pinmuxgen as gentypes
+        elif output_type == 'myhdl':
+            from myhdlgen.pinmux_generator import pinmuxgen as gentypes
+        else:
+            print ("ERROR: output type '%s' does not exist" % output_type)
             printhelp()
             sys.exit(0)
-        gentypes[output_type](output_dir, validate)
+
+        gentypes(output_dir, validate)