New parse & solve strategy based on Directed Acyclic Graphs

parent f694a735
......@@ -154,6 +154,7 @@ class DepFile(File):
self.provided_architectures = []
self.provided_entities = []
self.provided_packages = []
self.used_packages = []
self.is_parsed = False
......
......@@ -208,14 +208,9 @@ class ModulePool(list):
top_entity = self.top_module.top_module
#self.solve_dependencies()
all_files = self.build_complete_file_set()
if not self._deps_solved:
logging.debug("- begin solve")
dep_solver.solve(all_files)
logging.debug("- end solve")
self._deps_solved = True
from srcfile import SourceFileSet
source_files = SourceFileSet()
source_files.add(dep_solver.make_dependency_set(all_files, top_entity))
source_files.add(dep_solver.solve(all_files, top_entity))
return source_files
def get_top_module(self):
......
This diff is collapsed.
......@@ -78,7 +78,7 @@ class VerilogFile(SourceFile):
if include_dirs:
self.include_dirs.extend(include_dirs)
self.include_dirs.append(path_mod.relpath(self.dirname))
self.provided_modules = []
class SVFile(VerilogFile):
pass
......
......@@ -52,6 +52,12 @@ class Architecture():
self.model = None;
self.components = None;
self.entities = None;
self.instances = None;
class Package():
def __init__(self):
self.model = None;
self.components = None;
class VHDLParser(DepParser):
......@@ -107,26 +113,41 @@ class VHDLParser(DepParser):
if len(architecture_inner_content) == 1:
architecture_aux.components = component_pattern.findall(architecture_inner_content[0])
instances_pattern = re.compile("^\s*(\w+)\s*\:\s*(\w+)\s*(?:port\s+map.*?;|generic\s+map.*?;|\s*;)", re.DOTALL | re.MULTILINE | re.IGNORECASE )
instance_from_library_pattern = re.compile("^\s*(\w+)\s*\:\s*entity\s*(\w+)\s*\.\s*(\w+)\s*(?:port\s+map.*?;|generic\s+map.*?;|\s*;)", re.DOTALL | re.MULTILINE | re.IGNORECASE )
architecture_aux.entities = instances_pattern.findall(architecture_inner_content[0])
architecture_aux.instances = instance_from_library_pattern.findall(architecture_inner_content[0])
dep_file.provided_architectures.append(architecture_aux)
instance_from_library_pattern = re.compile("^\s*(\w+)\s*\:\s*entity\s*(\w+)\s*\.\s*(\w+)\s*(?:port\s+map.*?;|generic\s+map.*?;|\s*;)", re.DOTALL | re.MULTILINE | re.IGNORECASE )
print("**********************************************************************************")
print(instance_from_library_pattern.findall(buf))
print("**********************************************************************************")
#print("Dump architectures")
#for architecture_test in dep_file.architectures:
# print("--------------------------")
# print(architecture_test.model)
# print(architecture_test.components)
# print(architecture_test.entities)
# print("--------------------------")
#new package
package_pattern = re.compile("^\s*package\s+(\w+)\s+is", re.DOTALL | re.MULTILINE | re.IGNORECASE )
def do_package(s) :
logging.debug("found package %s.%s" % (dep_file.library, s.group(1) ))
dep_file.add_relation(DepRelation("%s.%s" % (dep_file.library, s.group(1)),
DepRelation.PROVIDE,
DepRelation.PACKAGE))
return "<hdlmake package %s.%s>" % (dep_file.library, s.group(1))
buf = re.sub(package_pattern, do_package, buf)
#def do_package(s) :
# logging.debug("found package %s.%s" % (dep_file.library, s.group(1) ))
# dep_file.add_relation(DepRelation("%s.%s" % (dep_file.library, s.group(1)),
# DepRelation.PROVIDE,
# DepRelation.PACKAGE))
# return "<hdlmake package %s.%s>" % (dep_file.library, s.group(1))
#buf = re.sub(package_pattern, do_package, buf)
provided_packages = package_pattern.findall(buf)
print("Provided packages dependencies:")
print(provided_packages)
for package in provided_packages:
package_aux = Package();
package_aux.model = package
package_inner_pattern = re.compile("package\s+%s\s+is(.*)end\s+%s.*?;" % (package, package), re.DOTALL | re.MULTILINE | re.IGNORECASE )
package_inner_content = package_inner_pattern.findall(buf)
print("******************* Package inner content ********************************")
print(package_inner_content)
component_pattern = re.compile("^\s*component\s+(\w+).*?end\s+component.*?;", re.DOTALL | re.MULTILINE | re.IGNORECASE )
if len(package_inner_content) == 1:
package_aux.components = component_pattern.findall(package_inner_content[0])
print(package_aux.components)
dep_file.provided_packages.append(package_aux)
#component declaration
component_pattern = re.compile("^\s*component\s+(\w+).*?end\s+component.*?;", re.DOTALL | re.MULTILINE | re.IGNORECASE )
......
......@@ -264,6 +264,12 @@ class VerilogPreprocessor(object):
return list(set(deps))
class VlogModule():
def __init__(self):
self.model = None;
self.instances = None;
class VerilogParser(DepParser):
reserved_words = ["accept_on",
......@@ -577,30 +583,38 @@ class VerilogParser(DepParser):
logging.debug("file %s imports/uses %s.%s package" %( dep_file.path , dep_file.library, s.group(1) ) )
dep_file.add_relation( DepRelation( "%s.%s" % (dep_file.library, s.group(1)) , DepRelation.USE, DepRelation.PACKAGE))
re.subn(import_pattern, do_imports, buf)
#----------------------------------------------
use_packages = import_pattern.findall(buf)
print('use package:\n %s' % use_packages)
dep_file.used_packages = use_packages
#packages
m_inside_package = re.compile("package\s+(\w+)\s*(?:\(.*?\))?\s*(.+?)endpackage", re.DOTALL | re.MULTILINE)
def do_package(s):
logging.debug("found pacakge %s.%s" %(dep_file.library, s.group(1)) )
dep_file.add_relation(DepRelation( "%s.%s" % (dep_file.library, s.group(1)), DepRelation.PROVIDE, DepRelation.PACKAGE))
re.subn(m_inside_package, do_package, buf)
#----------------------------------------------
provide_packages = m_inside_package.findall(buf)
print('provide package:\n %s' % provide_packages)
dep_file.provided_packages = provide_packages
#modules and instatniations
m_inside_module = re.compile("(?:module|interface)\s+(\w+)\s*(?:\(.*?\))?\s*(.+?)(?:endmodule|endinterface)", re.DOTALL | re.MULTILINE)
m_instantiation = re.compile("(?:\A|\\s*)\s*(\w+)\s+(?:#\s*\(.*?\)\s*)?(\w+)\s*\(.*?\)\s*", re.DOTALL | re.MULTILINE)
def do_module(s):
logging.debug("found module %s.%s" % (dep_file.library, s.group(1) ))
dep_file.add_relation(DepRelation( "%s.%s" % (dep_file.library, s.group(1)), DepRelation.PROVIDE, DepRelation.MODULE))
def do_inst(s):
mod_name = s.group(1)
if(mod_name in self.reserved_words):
return
logging.debug("-> instantiates %s.%s as %s" % (dep_file.library, s.group(1), s.group(2) ))
dep_file.add_relation(DepRelation( "%s.%s" % (dep_file.library, s.group(1)), DepRelation.USE, DepRelation.MODULE))
re.subn(m_instantiation, do_inst, s.group(2))
re.subn(m_inside_module, do_module, buf)
dep_file.add_relation(DepRelation(dep_file.path, DepRelation.PROVIDE, DepRelation.INCLUDE))
#----------------------------------------------
provide_modules = m_inside_module.findall(buf)
print('provide module:\n %s' % provide_modules)
for module in provide_modules:
module_aux = VlogModule();
module_aux.model = module[0]
m_instantiation = re.compile("(?:\A|\\s*)\s*(\w+)\s+(?:#\s*\(.*?\)\s*)?(\w+)\s*\(.*?\)\s*", re.DOTALL | re.MULTILINE)
used_instances = m_instantiation.findall(module[1])
print("used instances:")
module_aux.instances = used_instances
print(used_instances)
dep_file.provided_modules.append(module_aux)
dep_file.is_parsed = True
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