Refactor how the fileset is built and managed

parent a67c8fde
......@@ -33,6 +33,7 @@ from hdlmake import shell
from hdlmake.util.termcolor import colored
from hdlmake import new_dep_solver as dep_solver
from hdlmake import fetch as fetch_mod
from hdlmake.srcfile import SourceFileSet
def set_logging_level(options):
......@@ -65,6 +66,8 @@ class Action(list):
def __init__(self, options):
super(Action, self).__init__()
self.top_module = None
self.parseable_fileset = SourceFileSet()
self.privative_fileset = SourceFileSet()
self._deps_solved = False
self.options = options
set_logging_level(options)
......@@ -76,10 +79,13 @@ class Action(list):
action = self.config.get("action")
if action == None:
self.tool = None
self.top_entity = None
elif action == "simulation":
self.tool = load_sim_tool(self.config.get("sim_tool"))
self.top_entity = self.config.get("sim_top")
elif action == "synthesis":
self.tool = load_syn_tool(self.config.get("syn_tool"))
self.top_entity = self.config.get("syn_top")
else:
logging.error("Unknown requested action: %s", action)
quit()
......@@ -132,25 +138,42 @@ class Action(list):
def build_complete_file_set(self):
"""Build file set with all the files listed in the complete pool"""
logging.debug("Begin build complete file set")
from hdlmake.srcfile import SourceFileSet
all_manifested_files = SourceFileSet()
for module in self:
all_manifested_files.add(module.files)
logging.debug("End build complete file set")
return all_manifested_files
def build_file_set(self, top_entity=None, standard_libs=None):
def solve_file_set(self):
"""Build file set with only those files required by the top entity"""
logging.debug("Begin build file set for %s", top_entity)
all_files = self.build_complete_file_set()
if not self._deps_solved:
dep_solver.solve(all_files, standard_libs=standard_libs)
dep_solver.solve(self.parseable_fileset,
self.tool.get_standard_libs())
self._deps_solved = True
from hdlmake.srcfile import SourceFileSet
source_files = SourceFileSet()
source_files.add(dep_solver.make_dependency_set(all_files, top_entity))
logging.debug("End build file set")
return source_files
solved_files = SourceFileSet()
solved_files.add(dep_solver.make_dependency_set(
self.parseable_fileset, self.top_entity))
self.parseable_fileset = solved_files
def build_file_set(self):
"""Initialize the parseable and privative fileset contents"""
total_files = self.build_complete_file_set()
for file_aux in total_files:
if any(isinstance(file_aux, file_type)
for file_type in self.tool.get_privative_files()):
self.privative_fileset.add(file_aux)
elif any(isinstance(file_aux, file_type)
for file_type in self.tool.get_parseable_files()):
self.parseable_fileset.add(file_aux)
else:
logging.error("File not supported by the tool: %s",
file_aux.path)
if len(self.privative_fileset) > 0:
logging.info("Detected %d supported files that are not parseable",
len(self.privative_fileset))
if len(self.parseable_fileset) > 0:
logging.info("Detected %d supported files that can be parsed",
len(self.parseable_fileset))
def get_top_module(self):
"""Get the Top module from the pool"""
......
......@@ -61,7 +61,13 @@ class ActionCore(Action):
def makefile(self):
"""Write the Makefile for the current design"""
self._check_all_fetched_or_quit()
self.tool.write_makefile(self)
self.build_file_set()
self.solve_file_set()
combined_fileset = self.parseable_fileset
combined_fileset.add(self.privative_fileset)
self.tool.write_makefile(self.config,
combined_fileset,
filename=self.options.filename)
def _fetch_all(self):
"""Fetch all the modules declared in the design"""
......@@ -141,8 +147,11 @@ class ActionCore(Action):
for mod_aux in unfetched_modules:
logging.warning(
"List incomplete, module %s has not been fetched!", mod_aux)
file_set = self.build_file_set(top_entity=self.options.top)
file_list = dep_solver.make_dependency_sorted_list(file_set)
self.top_entity = self.options.top
self.build_file_set()
self.solve_file_set()
file_list = dep_solver.make_dependency_sorted_list(
self.parseable_fileset)
files_str = [file_aux.path for file_aux in file_list]
if self.options.reverse is True:
files_str.reverse()
......
......@@ -9,7 +9,6 @@ import logging
from .makefile import ToolMakefile
from hdlmake import shell
from hdlmake.srcfile import VerilogFile, VHDLFile, SVFile
from hdlmake.dep_file import DepFile
def _check_simulation_manifest(manifest_dict):
......@@ -30,17 +29,10 @@ class ToolSim(ToolMakefile):
super(ToolSim, self).__init__()
self._simulator_controls = {}
def write_makefile(self, pool):
def write_makefile(self, config, fileset, filename=None):
"""Execute the simulation action"""
_check_simulation_manifest(pool.config)
fset = pool.build_file_set(
pool.config.get("sim_top"),
standard_libs=self._standard_libs)
# Filter the not parseable files!
dep_files = fset.filter(DepFile)
# dep_solver.solve(dep_files)
self.makefile_setup(pool.config, dep_files,
filename=pool.options.filename)
_check_simulation_manifest(config)
self.makefile_setup(config, fileset, filename=filename)
self.makefile_check_tool('sim_path')
self.makefile_sim_top()
self.makefile_sim_options()
......
......@@ -39,24 +39,11 @@ class ToolSyn(ToolMakefile):
def __init__(self):
super(ToolSyn, self).__init__()
def write_makefile(self, pool):
def write_makefile(self, config, fileset, filename=None):
"""Generate a Makefile for the specific synthesis tool"""
_check_synthesis_manifest(pool.config)
fileset = pool.build_file_set(
pool.config["syn_top"],
standard_libs=self._standard_libs)
sup_files = pool.build_complete_file_set()
privative_files = []
for file_aux in sup_files:
if any(isinstance(file_aux, file_type)
for file_type in self._supported_files):
privative_files.append(file_aux)
if len(privative_files) > 0:
logging.info("Detected %d supported files that are not parseable",
len(privative_files))
fileset.add(privative_files)
self.makefile_setup(pool.config, fileset,
filename=pool.options.filename)
_check_synthesis_manifest(config)
self.makefile_setup(config, fileset,
filename=filename)
self.makefile_check_tool('syn_path')
self.makefile_includes()
self.makefile_syn_top()
......
......@@ -53,6 +53,18 @@ class ToolMakefile(object):
if self._file:
self._file.close()
def get_standard_libs(self):
"""Get the standard libs supported by the tool"""
return self._standard_libs
def get_parseable_files(self):
"""Get the parseable HDL file types supported by the tool"""
return self._hdl_files
def get_privative_files(self):
"""Get the privative format file types supported by the tool"""
return self._supported_files
def makefile_setup(self, manifest_project_dict, fileset, filename=None):
"""Set the Makefile configuration"""
self.manifest_dict = manifest_project_dict
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment