Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / expand.py
index cd621646d4b929983d56ab4dac33656b42847da9..31e06da956453138e312be399f96be30cbac91f3 100644 (file)
@@ -269,42 +269,54 @@ class MemoryMapObject(DataObject):
         super().__init__("", record)
 
     def _parse(self, record):
-        if "granule" in self._record:
-            self.__g = MemoryMapObject.GranuleObject(self._record["granule"])
-        if "regions" in self._record:
-            self.__regions = ArrayObject(self._record["regions"])
-        if "width" in self._record:
-            self.__width = DataObject.create("width", self._record["width"])
-
-    def __process(self, start_addr, idx, regions, size_lookahead = False):
+        for k, v in record.items():
+            if k.startswith("$"):
+                self.ctrl_field[k.strip("$")] = FieldType.create(k, v)
+            elif k.startswith("@"):
+                self.ctrl_field[k.strip("@")] = DataObject.create(k, v)
+        
+        if "granule" in record:
+            self.__g = MemoryMapObject.GranuleObject(record["granule"])
+
+        if "regions" in record:
+            self.__regions = ArrayObject(record["regions"])
+
+        if "width" in record:
+            self.__width = DataObject.create("width", record["width"])
+
+    def __process(self, start_addr, idx, regions):
         if idx >= len(regions):
             raise Exception("Unbounded region definition")
         
         e = regions[idx]
 
-        if "boundary" in e:
-            b = e["boundary"] - 1
-            start_addr = (start_addr + b) & ~b
-
         if "start" not in e:
-            e["start"] = start_addr
-        elif e["start"] < start_addr:
+            ne = regions[idx + 1]
+            if "start" not in ne or "size" not in e:
+                e["start"] = start_addr
+            else:
+                self.__process(start_addr + e["size"], idx + 1, regions)
+                e["start"] = ne['start'] - e["size"]
+
+        if "block" in e:
+            b = e["block"] - 1
+            e["start"] = (e["start"] + b) & ~b
+
+        if e["start"] < start_addr:
             raise Exception(f"starting addr {hex(e['start'])} overrlapping with {hex(start_addr)}")
-        else:
-            start_addr = e["start"]
         
-        if "size" not in e:
-            if size_lookahead:
-                raise Exception("could not infer size from unbounded region")
-            tmp_addr = self.__process(start_addr, idx + 1, regions, size_lookahead=True)
-            e["size"] = tmp_addr - start_addr
+        start_addr = e["start"]
         
-        if not size_lookahead:
-            start_addr += e["size"]
+        if "size" not in e:
+            self.__process(start_addr, idx + 1, regions)
+            ne = regions[idx + 1]
+            e["size"] = ne['start'] - start_addr
         
-        return start_addr
+        return start_addr + e["size"]
     
     def expand(self, param={}):
+        super().expand(param)
+
         g = self.__g.expand(param)
 
         param["granule"] = g
@@ -433,10 +445,13 @@ class TemplateExpander:
                 
                 self.mapping[src] = dest.strip()
 
-    def render(self):
+    def render(self, selected = []):
         for k, v in self.mapping.items():
             src: Path = self.tbase_path.joinpath(k)
             dest: Path = self.pbase_path.joinpath(v)
+            if (k not in selected):
+                continue
+
             if not src.is_file():
                 continue
 
@@ -456,6 +471,7 @@ import pprint
 
 def main():
     parser = argparse.ArgumentParser()
+    parser.add_argument("selects", nargs="*")
     parser.add_argument("--arch", default='i386')
     parser.add_argument("-twd", "--template_dir", default=str(Path.cwd()))
     parser.add_argument("-pwd", "--project_dir", default=str(Path.cwd()))
@@ -464,7 +480,7 @@ def main():
 
     expander = TemplateExpander(Path(args.template_dir), Path(args.project_dir), args.arch)
     
-    expander.render()
+    expander.render(args.selects)
     # pprint.pprint(expander.data)
 
 if __name__ == "__main__":