new axi addr map class
[pinmux.git] / src / ifacebase.py
index 81e4e9d2fcaa8da932a5bd04206744effcbd5052..fb5cd7a651735cedea96bf937e1c6a02c2c55344 100644 (file)
@@ -1,3 +1,4 @@
+import json
 import os.path
 
 try:
@@ -6,29 +7,72 @@ except ImportError:
     from collections import UserDict
 
 
+def _decode_list(data):
+    rv = []
+    for item in data:
+        if isinstance(item, unicode):
+            item = item.encode('utf-8')
+        elif isinstance(item, list):
+            item = _decode_list(item)
+        elif isinstance(item, dict):
+            item = _decode_dict(item)
+        rv.append(item)
+    return rv
+
+
+def _decode_dict(data):
+    rv = {}
+    for key, value in data.iteritems():
+        if isinstance(key, unicode):
+            key = key.encode('utf-8')
+        if isinstance(value, unicode):
+            value = value.encode('utf-8')
+        elif isinstance(value, list):
+            value = _decode_list(value)
+        elif isinstance(value, dict):
+            value = _decode_dict(value)
+        rv[key] = value
+    return rv
+
+
 class InterfacesBase(UserDict):
     """ contains a list of interface definitions
     """
 
     def __init__(self, ifacekls, pth=None, ifaceklsdict=None):
         self.pth = pth
-        self.fastbus = []
         self.ifacecount = []
+        self.fastbus = []
         if ifaceklsdict is None:
             ifaceklsdict = {}
         UserDict.__init__(self, {})
         if not pth:
             return
         ift = 'interfaces.txt'
+        cfg = 'configs.txt'
         if pth:
             ift = os.path.join(pth, ift)
+            cfg = os.path.join(pth, cfg)
+
+        # read in configs in JSON format, but strip out unicode
+        with open(cfg, 'r') as ifile:
+            self.configs = json.loads(ifile.read(), object_hook=_decode_dict)
+
+        # process the configs, look for "bus" type... XXX TODO; make this
+        # a bit more sophisticated
+        self.fastbus = []
+        for (ifacename, v) in self.configs.items():
+            if v.get('bus', "") == "fastbus":
+                self.fastbus.append(ifacename)
+
+        # reads the interfaces, name and quantity of each
         with open(ift, 'r') as ifile:
             for ln in ifile.readlines():
                 ln = ln.strip()
                 ln = ln.split("\t")
                 name = ln[0]  # will have uart
                 count = int(ln[1])  # will have count of uart
-                self.fastbus += ln[2:]
+
                 # spec looks like this:
                 """
                 [{'name': 'sda', 'outen': True},
@@ -51,6 +95,19 @@ class InterfacesBase(UserDict):
                 else:
                     iface = ikls(name, spec, ganged, count == 1)
                     self.ifaceadd(name, count, iface)
+                cfgs = self.getconfigs(name, count)
+                iface.configs = cfgs
+                print name, count, cfgs
+
+    def getconfigs(self, fname, count):
+        cfgs = []
+        for i in range(count):
+            if count == 1:
+                name = fname
+            else:
+                name = "%s%d" % (fname, i)
+            cfgs.append(self.configs.get(name, {}))
+        return cfgs
 
     def getifacetype(self, fname):
         # finds the interface type, e.g sd_d0 returns "inout"