Source code for hwtBuildsystem.vivado.logParser.synthesis
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from itertools import islice
import re
[docs]class VivadoSynthesisLogParser():
RE_TABLE_HEADER = re.compile("^\d+(\.\d+)*\.?\s+(\S+[^\n]*)")
RE_TABLE_TOP_LINE = re.compile("^\+(-*\+)+")
RE_SECTION_NAME_UNDERLINE = re.compile("^-+")
def __init__(self, text):
self.lines = text.split("\n")
self.tables = {}
def _parseTableSize(self, headerLine):
offset = 1 # 0 is table boundary
columns = []
for column in headerLine.split("+")[1:-1]:
c_width = len(column)
columns.append((offset, offset + c_width))
offset += c_width + 1 # +1 for table |
return columns
def _parseTableColumns(self, line, columnSizes):
return [line[x[0]: x[1]].strip() for x in columnSizes]
[docs] def indexByRowNameColumnName(self, table, rowName, columnName):
c_i = table[0].index(columnName)
for row in islice(table, 1, None):
if row[0] == rowName:
return row[c_i]
raise KeyError("The row with such a name not found", rowName)
[docs] def parse(self):
table_name = None
table_content = None
table_column_size = None
for line in self.lines:
if table_name:
if not line and table_content:
assert table_name not in self.tables, table_name
self.tables[table_name] = table_content
table_name = None
table_content = None
table_column_size = None
else:
m_table_top_line = self.RE_TABLE_TOP_LINE.match(line)
if m_table_top_line:
if table_column_size is None:
table_column_size = self._parseTableSize(line)
continue
if line and table_content is None:
m_underline = self.RE_SECTION_NAME_UNDERLINE.match(line)
if m_underline:
table_content = []
continue
else:
# false detection
table_name = None
elif line:
assert table_column_size, line
table_content.append(self._parseTableColumns(line, table_column_size))
else:
m = self.RE_TABLE_HEADER.match(line)
if m:
table_name = m.group(2)
[docs] def getBasicResourceReport(self):
"""
A small report function which extracts the most important values
from the tables contained in a report.
"""
Slice_Logic = self.tables["Slice Logic"]
Memory = self.tables["Memory"]
DSP = self.tables["DSP"]
i = self.indexByRowNameColumnName
return {
"lut": int(i(Slice_Logic, "Slice LUTs*", "Used")),
"ff": int(i(Slice_Logic, "Register as Flip Flop", "Used")),
"latch": int(i(Slice_Logic, "Register as Latch", "Used")),
'bram': float(i(Memory, "Block RAM Tile", "Used")),
'uram': 0,
'dsp': int(i(DSP, "DSPs", "Used")),
}
if __name__ == "__main__":
with open("../examples/tmp/ExampleTop0/ExampleTop0.runs/synth_1/ExampleTop0_utilization_synth.rpt") as f:
rp = VivadoSynthesisLogParser(f.read())
rp.parse()
for table_name, table in rp.tables.items():
print(table_name)
for x in table:
print(x)