forked from github/verilator
111 lines
3.7 KiB
Python
Executable File
111 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# pylint: disable=C0103,C0114,C0115,C0116,C0209,C0301
|
|
######################################################################
|
|
|
|
import argparse
|
|
import re
|
|
|
|
######################################################################
|
|
|
|
Header = []
|
|
Vertexes = []
|
|
Edges = []
|
|
|
|
#######################################################################
|
|
|
|
|
|
def dotread(filename):
|
|
with open(filename, "r", encoding="utf8") as fh:
|
|
header = True
|
|
vnum = 0
|
|
|
|
vertex_re = re.compile(r'^\t([a-zA-Z0-9_]+)\t(.*)$')
|
|
edge_re = re.compile(
|
|
r'^\t([a-zA-Z0-9_]+)\s+->\s+([a-zA-Z0-9_]+)\s*(.*)$')
|
|
|
|
for line in fh:
|
|
vertex_match = re.search(vertex_re, line)
|
|
edge_match = re.search(edge_re, line)
|
|
if vertex_match:
|
|
if vertex_match.group(1) != 'nTITLE':
|
|
header = False
|
|
Vertexes.append({
|
|
'num': vnum,
|
|
'line': line,
|
|
'name': vertex_match.group(1)
|
|
})
|
|
vnum += 1
|
|
elif edge_match:
|
|
fromv = edge_match.group(1)
|
|
tov = edge_match.group(2)
|
|
w = re.match(r'weight=(\d+)', line)
|
|
weight = w.group(1) if w else 1
|
|
w = re.match(r'style=(\S+)', line)
|
|
cutable = w.group(1) if w else None
|
|
edge = {
|
|
'num': vnum,
|
|
'line': line,
|
|
'weight': weight,
|
|
'cutable': cutable,
|
|
'from': fromv,
|
|
'to': tov
|
|
}
|
|
vnum += 1
|
|
Edges.append(edge)
|
|
elif header:
|
|
Header.append(line)
|
|
print("IGNORE: " + line)
|
|
|
|
|
|
#######################################################################
|
|
|
|
|
|
def cwrite(filename):
|
|
with open(filename, "w", encoding="utf8") as fh:
|
|
fh.write("void V3GraphTestImport::dotImport() {\n")
|
|
fh.write(" auto* gp = &m_graph;\n")
|
|
for ver in sorted(Vertexes, key=lambda ver: ver['num']):
|
|
fh.write(
|
|
" auto* %s = new V3GraphTestVertex{gp, \"%s\"}; if (%s) {}\n"
|
|
% (ver['name'], ver['name'], ver['name']))
|
|
fh.write("\n")
|
|
for edge in Edges:
|
|
fh.write(" new V3GraphEdge{gp, %s, %s, %s, %s};\n" %
|
|
(edge['from'], edge['to'], edge['weight'],
|
|
"true" if edge['cutable'] else "false"))
|
|
fh.write("}\n")
|
|
|
|
|
|
######################################################################
|
|
# main
|
|
|
|
parser = argparse.ArgumentParser(
|
|
allow_abbrev=False,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
description=
|
|
"""dot_importer takes a graphvis .dot file and converts into .cpp file.
|
|
This x.cpp file is then manually included in V3GraphTest.cpp to verify
|
|
various xsub-algorithms.""",
|
|
epilog=
|
|
"""Copyright 2005-2023 by Wilson Snyder. This program is free software; you
|
|
can redistribute it and/or modify it under the terms of either the GNU
|
|
Lesser General Public License Version 3 or the Perl Artistic License
|
|
Version 2.0.
|
|
|
|
SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0""")
|
|
|
|
parser.add_argument('--debug',
|
|
action='store_const',
|
|
const=9,
|
|
help='enable debug')
|
|
parser.add_argument('filename', help='input .dot filename to process')
|
|
|
|
Args = parser.parse_args()
|
|
dotread(Args.filename)
|
|
cwrite("graph_export.cpp")
|
|
|
|
######################################################################
|
|
# Local Variables:
|
|
# compile-command: "./dot_importer ../test_regress/obj_vlt/t_EXAMPLE/*orderg_o*.dot && cat graph_export.cpp"
|
|
# End:
|