tools/remote/csr_builder: allow comments in csv file and cleanup
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 24 Apr 2019 10:25:49 +0000 (12:25 +0200)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 24 Apr 2019 10:25:49 +0000 (12:25 +0200)
litex/tools/remote/csr_builder.py

index 1bbb54a7ccdd06dff41bf879bb96d4cd55528865..001f7e84c173c73af5da2c5cc50289f644c92642 100644 (file)
@@ -57,7 +57,8 @@ class CSRMemoryRegion:
 
 class CSRBuilder:
     def __init__(self, comm, csr_csv, csr_data_width=None):
-        self.constants = self.build_constants(csr_csv)
+        self.items = self.get_csr_items(csr_csv)
+        self.constants = self.build_constants()
 
         # Load csr_data_width from the constants, otherwise it must be provided
         constant_csr_data_width = self.constants.d.get('csr_data_width', None)
@@ -70,23 +71,25 @@ class CSRBuilder:
                 csr_data_width, constant_csr_data_width))
 
         self.csr_data_width = csr_data_width
-        self.bases = self.build_bases(csr_csv)
-        self.regs = self.build_registers(csr_csv, comm.read, comm.write)
-        self.mems = self.build_memories(csr_csv)
+        self.bases = self.build_bases()
+        self.regs = self.build_registers(comm.read, comm.write)
+        self.mems = self.build_memories()
 
-    def build_bases(self, csr_csv):
-        csv_reader = csv.reader(open(csr_csv), delimiter=',', quotechar='#')
+    @staticmethod
+    def get_csr_items(csr_csv):
+        return list(csv.reader(filter(lambda row: row[0] != "#", open(csr_csv))))
+
+    def build_bases(self):
         d = {}
-        for item in csv_reader:
+        for item in self.items:
             group, name, addr, dummy0, dummy1 = item
             if group == "csr_base":
                 d[name] = int(addr.replace("0x", ""), 16)
         return CSRElements(d)
 
-    def build_registers(self, csr_csv, readfn, writefn):
-        csv_reader = csv.reader(open(csr_csv), delimiter=',', quotechar='#')
+    def build_registers(self, readfn, writefn):
         d = {}
-        for item in csv_reader:
+        for item in self.items:
             group, name, addr, length, mode = item
             if group == "csr_register":
                 addr = int(addr.replace("0x", ""), 16)
@@ -94,10 +97,9 @@ class CSRBuilder:
                 d[name] = CSRRegister(readfn, writefn, name, addr, length, self.csr_data_width, mode)
         return CSRElements(d)
 
-    def build_constants(self, csr_csv):
-        csv_reader = csv.reader(open(csr_csv), delimiter=',', quotechar='#')
+    def build_constants(self):
         d = {}
-        for item in csv_reader:
+        for item in self.items:
             group, name, value, dummy0, dummy1 = item
             if group == "constant":
                 try:
@@ -106,10 +108,9 @@ class CSRBuilder:
                     d[name] = value
         return CSRElements(d)
 
-    def build_memories(self, csr_csv):
-        csv_reader = csv.reader(open(csr_csv), delimiter=',', quotechar='#')
+    def build_memories(self):
         d = {}
-        for item in csv_reader:
+        for item in self.items:
             group, name, base, size, dummy1 = item
             if group == "memory_region":
                 d[name] = CSRMemoryRegion(int(base, 16), int(size))