Commit baedf822 authored by Paweł Szostek's avatar Paweł Szostek

moving fetching infrastructure to separate files

parent 9cbfe359
#!/usr/bin/env python
from backend_factory import BackendFactory
#!/usr/bin/env python
from git import Git
from svn import Svn
import logging
class Local(object):
def __init__(self):
pass
def fetch(self, module):
pass
class BackendFactory(object):
def __init__(self):
pass
def get_backend(self, module):
if module.source == "local":
return Local()
else:
logging.info("Fetching module: " + str(module) +
"[parent: " + str(module.parent) + "]")
if module.source == "svn":
return Svn()
if module.source == "git":
return Git()
#!/usr/bin/env python
import os
import path
import logging
class Git(object):
def __init__(self):
pass
def fetch(self, module):
if not os.path.exists(module.fetchto):
os.mkdir(module.fetchto)
cur_dir = os.getcwd()
if module.branch is None:
module.branch = "master"
basename = path.url_basename(module.url)
mod_path = os.path.join(module.fetchto, basename)
if basename.endswith(".git"):
basename = basename[:-4] # remove trailing .git
if module.isfetched:
update_only = True
else:
update_only = False
if update_only:
cmd = "(cd {0} && git checkout {1})"
cmd = cmd.format(mod_path, module.branch)
else:
cmd = "(cd {0} && git clone -b {2} {1})"
cmd = cmd.format(module.fetchto, module.url, module.branch)
success = True
logging.debug("Running %s" % cmd)
if os.system(cmd) != 0:
success = False
if module.revision is not None and success is True:
logging.debug("cd %s" % mod_path)
os.chdir(mod_path)
cmd = "git checkout " + module.revision
logging.debug("Running %s" % cmd)
if os.system(cmd) != 0:
success = False
os.chdir(cur_dir)
module.isfetched = True
module.path = mod_path
return success
#!/usr/bin/env python
import os
import logging
class Svn(object):
def __init__(self):
pass
def fetch(self, module):
if not os.path.exists(module.fetchto):
os.mkdir(module.fetchto)
cur_dir = os.getcwd()
os.chdir(module.fetchto)
cmd = "svn checkout {0} " + module.basename
if module.revision:
cmd = cmd.format(module.url + '@' + module.revision)
else:
cmd = cmd.format(module.url)
success = True
logging.debug(cmd)
if os.system(cmd) != 0:
success = False
os.chdir(cur_dir)
module.isfetched = True
module.path = os.path.join(module.fetchto, module.basename)
return success
......@@ -26,8 +26,9 @@ import path
from makefile_writer import MakefileWriter
from flow import ISEProject
from flow_altera import QuartusProject
from dep_solver import DependencySolver
from srcfile import IDependable, SourceFileSet, SourceFileFactory
import dep_solver
from srcfile import SourceFileSet, SourceFileFactory
from dependable_file import DependableFile
class HdlmakeKernel(object):
......@@ -128,24 +129,22 @@ class HdlmakeKernel(object):
quit()
else:
logging.info("Generating ModelSim makefile for simulation.")
solver = DependencySolver()
pool = self.modules_pool
self._check_all_fetched_or_quit()
top_module = pool.get_top_module()
flist = pool.build_global_file_list()
flist_sorted = solver.solve(flist)
flist_sorted = dep_solver.solve(flist)
#self.make_writer.generate_modelsim_makefile(flist_sorted, top_module)
self.make_writer.generate_vsim_makefile(flist_sorted, top_module)
def _generate_isim_makefile(self):
# p.info("Generating makefile for simulation.")
if self.env["isim_path"] is None:
if self.env["isim_path"] is None and self.env["xilinx"] is None:
logging.error("Can't generate an ISim makefile. ISim not found.")
quit()
else:
logging.info("Generating ISE Simulation (ISim) makefile for simulation.")
solver = DependencySolver()
pool = self.modules_pool
self._check_all_fetched_or_quit()
......@@ -155,24 +154,22 @@ class HdlmakeKernel(object):
logging.error("top_module variable must be set in the top manifest.")
quit()
flist = pool.build_global_file_list()
flist_sorted = solver.solve(flist)
flist_sorted = dep_solver.solve(flist)
self.make_writer.generate_isim_makefile(flist_sorted, top_module)
def _generate_iverilog_makefile(self):
from dep_solver import DependencySolver
if self.env["isim_path"] is None:
if self.env["iverilog_path"] is None:
logging.error("Can't generate an IVerilog makefile. IVerilog not found.")
quit()
else:
logging.info("Generating makefile for simulation.")
solver = DependencySolver()
pool = self.modules_pool
self._check_all_fetched_or_quit()
tm = pool.get_top_module()
flist = pool.build_global_file_list()
flist_sorted = solver.solve(flist)
flist_sorted = dep_solver.solve(flist)
self.make_writer.generate_iverilog_makefile(flist_sorted, tm, pool)
def generate_ise_makefile(self):
......@@ -249,9 +246,8 @@ class HdlmakeKernel(object):
def _update_existing_ise_project(self):
top_mod = self.modules_pool.get_top_module()
fileset = self.modules_pool.build_global_file_list()
solver = DependencySolver()
non_dependable = fileset.inversed_filter(IDependable)
dependable = solver.solve(fileset)
non_dependable = fileset.inversed_filter(DependableFile)
dependable = dep_solver.solve(fileset)
all_files = SourceFileSet()
all_files.add(non_dependable)
all_files.add(dependable)
......@@ -270,9 +266,8 @@ class HdlmakeKernel(object):
def _create_new_ise_project(self, ise):
top_mod = self.modules_pool.get_top_module()
fileset = self.modules_pool.build_global_file_list()
solver = DependencySolver()
non_dependable = fileset.inversed_filter(IDependable)
fileset = solver.solve(fileset)
non_dependable = fileset.inversed_filter(DependableFile)
fileset = dep_solver.solve(fileset)
fileset.add(non_dependable)
prj = ISEProject(ise=self.env["ise_version"],
......@@ -293,9 +288,8 @@ class HdlmakeKernel(object):
def _create_new_quartus_project(self):
top_mod = self.modules_pool.get_top_module()
fileset = self.modules_pool.build_global_file_list()
solver = DependencySolver()
non_dependable = fileset.inversed_filter(IDependable)
fileset = solver.solve(fileset)
non_dependable = fileset.inversed_filter(DependableFile)
fileset = dep_solver.solve(fileset)
fileset.add(non_dependable)
prj = QuartusProject(top_mod.syn_project)
......@@ -313,9 +307,8 @@ class HdlmakeKernel(object):
def _update_existing_quartus_project(self):
top_mod = self.modules_pool.get_top_module()
fileset = self.modules_pool.build_global_file_list()
solver = DependencySolver()
non_dependable = fileset.inversed_filter(IDependable)
fileset = solver.solve(fileset)
non_dependable = fileset.inversed_filter(DependableFile)
fileset = dep_solver.solve(fileset)
fileset.add(non_dependable)
prj = QuartusProject(top_mod.syn_project)
prj.read()
......@@ -375,8 +368,6 @@ class HdlmakeKernel(object):
from srcfile import VerilogFile, VHDLFile, NGCFile
from vlog_parser import VerilogPreprocessor
solver = DependencySolver()
pool = self.modules_pool
if not pool.is_everything_fetched():
logging.error("A module remains unfetched. Fetching must be done prior to makefile generation")
......@@ -384,7 +375,7 @@ class HdlmakeKernel(object):
quit()
flist = pool.build_global_file_list()
flist_sorted = solver.solve(flist)
flist_sorted = dep_solver.solve(flist)
# if not os.path.exists(self.options.merge_cores):
# os.makedirs(self.options.merge_cores)
base = self.options.merge_cores
......
......@@ -23,108 +23,11 @@
from __future__ import print_function
import os
import logging
import path
import global_mod
from fetch import BackendFactory
class ModulePool(list):
class ModuleFetcher:
def __init__(self):
pass
def fetch_single_module(self, module):
new_modules = []
logging.debug("Fetching module: " + str(module))
if module.source == "local":
logging.debug("ModPath: " + module.path)
else:
logging.info("Fetching module: " + str(module) +
"[parent: " + str(module.parent) + "]")
if module.source == "svn":
logging.info("[svn] Fetching to " + module.fetchto)
self.__fetch_from_svn(module)
if module.source == "git":
logging.info("[git] Fetching to " + module.fetchto)
self.__fetch_from_git(module)
module.parse_manifest()
module.process_manifest()
new_modules.extend(module.local)
new_modules.extend(module.svn)
new_modules.extend(module.git)
return new_modules
def __fetch_from_svn(self, module):
if not os.path.exists(module.fetchto):
os.mkdir(module.fetchto)
cur_dir = os.getcwd()
os.chdir(module.fetchto)
cmd = "svn checkout {0} " + module.basename
if module.revision:
cmd = cmd.format(module.url + '@' + module.revision)
else:
cmd = cmd.format(module.url)
rval = True
logging.debug(cmd)
if os.system(cmd) != 0:
rval = False
os.chdir(cur_dir)
module.isfetched = True
module.path = os.path.join(module.fetchto, module.basename)
return rval
def __fetch_from_git(self, module):
if not os.path.exists(module.fetchto):
os.mkdir(module.fetchto)
cur_dir = os.getcwd()
if module.branch is None:
module.branch = "master"
basename = path.url_basename(module.url)
mod_path = os.path.join(module.fetchto, basename)
if basename.endswith(".git"):
basename = basename[:-4] # remove trailing .git
if module.isfetched:
update_only = True
else:
update_only = False
if update_only:
cmd = "(cd {0} && git checkout {1})"
cmd = cmd.format(mod_path, module.branch)
else:
cmd = "(cd {0} && git clone -b {2} {1})"
cmd = cmd.format(module.fetchto, module.url, module.branch)
rval = True
logging.debug(cmd)
if os.system(cmd) != 0:
rval = False
if module.revision and rval:
os.chdir(mod_path)
cmd = "git checkout " + module.revision
logging.debug(cmd)
if os.system(cmd) != 0:
rval = False
os.chdir(cur_dir)
module.isfetched = True
module.path = mod_path
return rval
def __init__(self, *args):
list.__init__(self, *args)
self.top_module = None
......@@ -142,6 +45,22 @@ class ModulePool(list):
return True
return False
def _fetch(self, module):
new_modules = []
logging.debug("Fetching module: " + str(module))
bf = BackendFactory()
fetcher = bf.get_backend(module)
fetcher.fetch(module)
module.parse_manifest()
module.process_manifest()
new_modules.extend(module.local)
new_modules.extend(module.svn)
new_modules.extend(module.git)
return new_modules
def new_module(self, parent, url, source, fetchto, process_manifest=True):
from module import Module
if url in [m.url for m in self]:
......@@ -178,7 +97,6 @@ class ModulePool(list):
return True
def fetch_all(self, unfetched_only=False):
fetcher = self.ModuleFetcher()
fetch_queue = [m for m in self]
while len(fetch_queue) > 0:
......@@ -188,9 +106,9 @@ class ModulePool(list):
if cur_mod.isfetched:
new_modules = cur_mod.submodules()
else:
new_modules = fetcher.fetch_single_module(cur_mod)
new_modules = self._fetch(cur_mod)
else:
new_modules = fetcher.fetch_single_module(cur_mod)
new_modules = self._fetch(cur_mod)
for mod in new_modules:
if not mod.isfetched:
logging.debug("Appended to fetch queue: " + str(mod.url))
......
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