You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
microwatt/scripts/dependencies.py

106 lines
2.7 KiB
Python

#!/usr/bin/python3
# Create makefile dependencies for VHDL files, looking for "use work" and
# "entity work" declarations
import sys
import re
import os
from collections import defaultdict
if len(sys.argv) == 1 and sys.argv[1] == '--help':
print("Usage: dependencies.py [--synth]")
sys.exit(1)
synth = False
args = sys.argv[1:]
if sys.argv[1] == '--synth':
synth = True
args = sys.argv[2:]
# Look at what a file provides
entity = re.compile('entity (.*) is')
package = re.compile('package (.*) is')
# Look at what a file depends on
work = re.compile('use work\.([^.]+)\.')
entity_work = re.compile('entity work\.([^;]+)')
# Synthesis targets
synth_provides = {
"dmi_dtm" : "dmi_dtm_dummy.vhdl",
"clock_generator" : "fpga/clk_gen_bypass.vhd",
"main_bram" : "fpga/main_bram.vhdl",
"pp_soc_uart" : "fpga/pp_soc_uart.vhd"
}
# Simulation targets
sim_provides = {
"dmi_dtm" : "dmi_dtm_xilinx.vhdl",
"clock_generator" : "fpga/clk_gen_bypass.vhd",
"main_bram" : "sim_bram.vhdl",
"pp_soc_uart" : "sim_pp_uart.vhdl"
}
if synth:
provides = synth_provides
else:
provides = sim_provides
dependencies = defaultdict(set)
for filename in args:
with open(filename, 'r') as f:
for line in f:
l = line.rstrip(os.linesep)
m = entity.search(l)
if m:
p = m.group(1)
if p not in provides:
provides[p] = filename
m = package.search(l)
if m:
p = m.group(1)
if p not in provides:
provides[p] = filename
m = work.search(l)
if m:
dependency = m.group(1)
dependencies[filename].add(dependency)
m = entity_work.search(l)
if m:
dependency = m.group(1)
dependencies[filename].add(dependency)
emitted = set()
def chase_dependencies(filename):
if filename not in dependencies:
if filename not in emitted:
print("%s " % (filename), end="")
emitted.add(filename)
else:
for dep in dependencies[filename]:
f = provides[dep]
chase_dependencies(f)
if f not in emitted:
print("%s " % (f), end="")
emitted.add(f)
if synth:
chase_dependencies("fpga/toplevel.vhdl")
print("fpga/toplevel.vhdl")
else:
for filename in dependencies:
(basename, suffix) = filename.split('.')
print("%s.o:" % (basename), end="")
for dependency in dependencies[filename]:
p = provides[dependency]
(basename2, suffix2) = p.split('.')
print(" %s.o" % (basename2), end="")
print("")