Move 'check_tool' method from Env to Tools package

parent ca7cdc4b
...@@ -28,8 +28,6 @@ from __future__ import absolute_import ...@@ -28,8 +28,6 @@ from __future__ import absolute_import
import os import os
import os.path import os.path
import logging import logging
from .util import path as path_mod
import six import six
...@@ -42,56 +40,6 @@ class Env(dict): ...@@ -42,56 +40,6 @@ class Env(dict):
dict.__init__(self) dict.__init__(self)
self.options = options self.options = options
def check_tool(self, info_class):
"""Check if the binary is available in the O.S. environment"""
def _get_path(name):
"""Get the directory in which the tool binary is at Host"""
location = os.popen(
path_mod.which_cmd() + " %s" %
name).read().split('\n', 1)[0].strip()
logging.debug("location for %s: %s", name, location)
return os.path.dirname(location)
def _is_in_path(name, path=None):
"""Check if the directory is in the system path"""
if path is not None:
return os.path.exists(os.path.join(path, name))
else:
assert isinstance(name, six.string_types)
path = _get_path(name)
return len(path) > 0
def _check_in_system_path(name):
"""Check if if in the system path exists a file named (name)"""
path = _get_path(name)
if path:
return True
else:
return False
tool_info = info_class._tool_info
if path_mod.check_windows():
bin_name = tool_info['windows_bin']
else:
bin_name = tool_info['linux_bin']
path_key = tool_info['id'] + '_path'
name = tool_info['name']
logging.debug("Checking if " + name + " tool is available on PATH")
self._report_and_set_hdlmake_var(path_key)
if self[path_key] is not None:
if _is_in_path(bin_name, self[path_key]):
logging.info("%s found under HDLMAKE_%s: %s",
name, path_key.upper(), self[path_key])
else:
logging.warning("%s NOT found under HDLMAKE_%s: %s",
name, path_key.upper(), self[path_key])
else:
if _check_in_system_path(bin_name):
self[path_key] = _get_path(bin_name)
logging.info("%s found in system PATH: %s",
name, self[path_key])
else:
logging.warning("%s cannnot be found in system PATH", name)
def _report_and_set_hdlmake_var(self, name): def _report_and_set_hdlmake_var(self, name):
"""Create a new entry in the Env dictionary and initialize the value """Create a new entry in the Env dictionary and initialize the value
to the obtained from the O.S. environmental variable if defined""" to the obtained from the O.S. environmental variable if defined"""
......
...@@ -96,6 +96,10 @@ class ManifestParser(ConfigParser): ...@@ -96,6 +96,10 @@ class ManifestParser(ConfigParser):
'default': None, 'default': None,
'help': "Tool to be used in the synthesis", 'help': "Tool to be used in the synthesis",
'type': ''}, 'type': ''},
{'name': 'syn_path',
'default': None,
'help': "Execution path for the Tool to be used in synthesis",
'type': ''},
{'name': 'syn_device', {'name': 'syn_device',
'default': None, 'default': None,
'help': "Target FPGA device", 'help': "Target FPGA device",
...@@ -194,6 +198,10 @@ class ManifestParser(ConfigParser): ...@@ -194,6 +198,10 @@ class ManifestParser(ConfigParser):
'default': None, 'default': None,
'help': "Simulation tool to be used (e.g. isim, vsim, iverilog)", 'help': "Simulation tool to be used (e.g. isim, vsim, iverilog)",
'type': ''}, 'type': ''},
{'name': 'sim_path',
'default': None,
'help': "Execution path for the Tool to be used in simulation",
'type': ''},
{'name': 'sim_pre_cmd', {'name': 'sim_pre_cmd',
'default': None, 'default': None,
'help': "Command to be executed before simulation", 'help': "Command to be executed before simulation",
......
...@@ -34,9 +34,6 @@ class ToolSim(ToolMakefile): ...@@ -34,9 +34,6 @@ class ToolSim(ToolMakefile):
"""Execute the simulation action""" """Execute the simulation action"""
_check_simulation_manifest(pool.top_module.manifest_dict) _check_simulation_manifest(pool.top_module.manifest_dict)
pool.check_all_fetched_or_quit() pool.check_all_fetched_or_quit()
pool.env.check_tool(self)
logging.info("Generating " + self._tool_info['name'] +
" makefile for simulation.")
top_module = pool.get_top_module() top_module = pool.get_top_module()
fset = pool.build_file_set( fset = pool.build_file_set(
top_module.manifest_dict["sim_top"], top_module.manifest_dict["sim_top"],
...@@ -45,6 +42,7 @@ class ToolSim(ToolMakefile): ...@@ -45,6 +42,7 @@ class ToolSim(ToolMakefile):
dep_files = fset.filter(DepFile) dep_files = fset.filter(DepFile)
# dep_solver.solve(dep_files) # dep_solver.solve(dep_files)
self.makefile_setup(top_module, dep_files) self.makefile_setup(top_module, dep_files)
self.makefile_check_tool('sim_path')
self.makefile_sim_top() self.makefile_sim_top()
self.makefile_sim_options() self.makefile_sim_options()
self.makefile_sim_local() self.makefile_sim_local()
......
...@@ -43,16 +43,7 @@ class ToolSyn(ToolMakefile): ...@@ -43,16 +43,7 @@ class ToolSyn(ToolMakefile):
"""Generate a project for the specific synthesis tool""" """Generate a project for the specific synthesis tool"""
_check_synthesis_manifest(pool.top_module.manifest_dict) _check_synthesis_manifest(pool.top_module.manifest_dict)
pool.check_all_fetched_or_quit() pool.check_all_fetched_or_quit()
tool_info = self._tool_info
path_key = tool_info['id'] + '_path'
name = tool_info['name']
env = pool.env
env.check_tool(self)
top_module = pool.get_top_module() top_module = pool.get_top_module()
if env[path_key]:
tool_path = env[path_key]
else:
tool_path = ""
fileset = pool.build_file_set( fileset = pool.build_file_set(
top_module.manifest_dict["syn_top"], top_module.manifest_dict["syn_top"],
standard_libs=self._standard_libs) standard_libs=self._standard_libs)
...@@ -67,8 +58,9 @@ class ToolSyn(ToolMakefile): ...@@ -67,8 +58,9 @@ class ToolSyn(ToolMakefile):
len(privative_files)) len(privative_files))
fileset.add(privative_files) fileset.add(privative_files)
self.makefile_setup(top_module, fileset) self.makefile_setup(top_module, fileset)
self.makefile_check_tool('syn_path')
self.makefile_includes() self.makefile_includes()
self.makefile_syn_top(tool_path) self.makefile_syn_top()
self.makefile_syn_tcl() self.makefile_syn_tcl()
self.makefile_syn_files() self.makefile_syn_files()
self.makefile_syn_local() self.makefile_syn_local()
...@@ -76,9 +68,9 @@ class ToolSyn(ToolMakefile): ...@@ -76,9 +68,9 @@ class ToolSyn(ToolMakefile):
self.makefile_syn_build() self.makefile_syn_build()
self.makefile_syn_clean() self.makefile_syn_clean()
self.makefile_syn_phony() self.makefile_syn_phony()
logging.info(name + " project file generated.") logging.info(self._tool_info['name'] + " project file generated.")
def makefile_syn_top(self, tool_path): def makefile_syn_top(self):
"""Create the top part of the synthesis Makefile""" """Create the top part of the synthesis Makefile"""
if path_mod.check_windows(): if path_mod.check_windows():
tcl_interpreter = self._tool_info["windows_bin"] tcl_interpreter = self._tool_info["windows_bin"]
...@@ -100,7 +92,7 @@ endif ...@@ -100,7 +92,7 @@ endif
tcl_interpreter=tcl_interpreter, tcl_interpreter=tcl_interpreter,
project_name=self.top_module.manifest_dict["syn_project"], project_name=self.top_module.manifest_dict["syn_project"],
project_ext=self._tool_info["project_ext"], project_ext=self._tool_info["project_ext"],
tool_path=tool_path, tool_path=self.top_module.manifest_dict["syn_path"],
top_module=self.top_module.manifest_dict["syn_top"])) top_module=self.top_module.manifest_dict["syn_top"]))
def makefile_syn_tcl(self): def makefile_syn_tcl(self):
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
from __future__ import absolute_import from __future__ import absolute_import
import os import os
import logging
import six
from hdlmake.util import path as path_mod from hdlmake.util import path as path_mod
...@@ -59,6 +61,57 @@ class ToolMakefile(object): ...@@ -59,6 +61,57 @@ class ToolMakefile(object):
self.top_module = top_module self.top_module = top_module
self.fileset = fileset self.fileset = fileset
def makefile_check_tool(self, path_key):
"""Check if the binary is available in the O.S. environment"""
def _get_path(name):
"""Get the directory in which the tool binary is at Host"""
location = os.popen(
path_mod.which_cmd() + " %s" %
name).read().split('\n', 1)[0].strip()
logging.debug("location for %s: %s", name, location)
return os.path.dirname(location)
def _is_in_path(name, path=None):
"""Check if the directory is in the system path"""
if path is not None:
return os.path.exists(os.path.join(path, name))
else:
assert isinstance(name, six.string_types)
path = _get_path(name)
return len(path) > 0
def _check_in_system_path(name):
"""Check if if in the system path exists a file named (name)"""
path = _get_path(name)
if path:
return True
else:
return False
tool_info = self._tool_info
if path_mod.check_windows():
bin_name = tool_info['windows_bin']
else:
bin_name = tool_info['linux_bin']
name = tool_info['name']
logging.debug("Checking if " + name + " tool is available on PATH")
if self.top_module.manifest_dict[path_key] is not None:
if _is_in_path(bin_name, self.top_module.manifest_dict[path_key]):
logging.info("%s found under HDLMAKE_%s: %s",
name, path_key.upper(),
self.top_module.manifest_dict[path_key])
else:
logging.warning("%s NOT found under HDLMAKE_%s: %s",
name, path_key.upper(),
self.top_module.manifest_dict[path_key])
else:
if _check_in_system_path(bin_name):
self.top_module.manifest_dict[path_key] = _get_path(bin_name)
logging.info("%s found in system PATH: %s",
name, self.top_module.manifest_dict[path_key])
else:
logging.warning("%s cannnot be found in system PATH", name)
def makefile_includes(self): def makefile_includes(self):
"""Add the included makefiles that need to be previously loaded""" """Add the included makefiles that need to be previously loaded"""
for file_aux in self.top_module.incl_makefiles: for file_aux in self.top_module.incl_makefiles:
......
...@@ -59,9 +59,9 @@ class ToolModelsim(VsimMakefileWriter): ...@@ -59,9 +59,9 @@ class ToolModelsim(VsimMakefileWriter):
def makefile_sim_options(self): def makefile_sim_options(self):
"""Print the Modelsim options to the Makefile""" """Print the Modelsim options to the Makefile"""
top_module = self.top_module top_module = self.top_module
if top_module.pool.env["modelsim_path"]: if top_module.manifest_dict["sim_path"]:
modelsim_ini_path = os.path.join( modelsim_ini_path = os.path.join(
top_module.pool.env["modelsim_path"], top_module.manifest_dict["sim_path"],
"..") "..")
else: else:
modelsim_ini_path = os.path.join("$(HDLMAKE_MODELSIM_PATH)", "..") modelsim_ini_path = os.path.join("$(HDLMAKE_MODELSIM_PATH)", "..")
......
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