def _subst_vars(self, ignored_subst_vars=[]): """Recursively search and replace substitution variables. First pass: search within self dict. We ignore errors since some substitions may be available in the second pass. Second pass: search the entire sim_cfg object.""" self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__, ignored_subst_vars, True) self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.sim_cfg.__dict__, ignored_subst_vars, False)
def __post_init__(self): # Ensure all mandatory attrs are set for attr in self.mandatory_cmd_attrs.keys(): if self.mandatory_cmd_attrs[attr] is False: log.error("Attribute \"%s\" not found for \"%s\".", attr, self.name) sys.exit(1) for attr in self.mandatory_misc_attrs.keys(): if self.mandatory_misc_attrs[attr] is False: log.error("Attribute \"%s\" not found for \"%s\".", attr, self.name) sys.exit(1) # Recursively search and replace wildcards self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__) # Set identifier. self.identifier = self.sim_cfg.name + ":" + self.name # Set the command, output dir and log self.odir = getattr(self, self.target + "_dir") # Set the output dir link name to the basename of odir (by default) self.odir_ln = os.path.basename(os.path.normpath(self.odir)) self.log = self.odir + "/" + self.target + ".log" # If using LSF, redirect stdout and err to the log file self.cmd = self.construct_cmd()
def __post_init__(self): # Ensure all mandatory attrs are set for attr in self.mandatory_cmd_attrs.keys(): if self.mandatory_cmd_attrs[attr] is False: log.error("Attribute \"%s\" not found for \"%s\".", attr, self.name) sys.exit(1) for attr in self.mandatory_misc_attrs.keys(): if self.mandatory_misc_attrs[attr] is False: log.error("Attribute \"%s\" not found for \"%s\".", attr, self.name) sys.exit(1) # Recursively search and replace wildcards # First pass: search within self dict. We ignore errors since some # substitions may be available in the second pass. self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__, [], True) # Second pass: search in sim_cfg dict, this time not ignoring errors. self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.sim_cfg.__dict__, [], False) # Set identifier. self.identifier = self.sim_cfg.name + ":" + self.name # Set the command, output dir and log self.odir = getattr(self, self.target + "_dir") # Set the output dir link name to the basename of odir (by default) self.odir_ln = os.path.basename(os.path.normpath(self.odir)) self.log = self.odir + "/" + self.target + ".log" # Make exports more easily mergeable with the current process' env. self._process_exports() # If using LSF, redirect stdout and err to the log file self.cmd = self.construct_cmd()
def _expand(self): '''Called to expand wildcards after merging hjson Subclasses can override this to do something just before expansion. ''' # If this is a primary configuration, it doesn't matter if we don't # manage to expand everything. partial = self.is_primary_cfg self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__, self.ignored_wildcards, ignore_error=partial)
def __post_init__(self): # Add cov db dirs from all the builds that were kicked off. for bld in self.sim_cfg.builds: self.cov_db_dirs += bld.cov_db_dir + " " # Recursively search and replace wildcards, ignoring cov_db_dirs. # We need to resolve it later based on cov_db_dirs value set below. # First pass: search within self dict. We ignore errors since some # substitions may be available in the second pass. self.__dict__ = find_and_substitute_wildcards( self.__dict__, self.__dict__, ignored_wildcards=["cov_db_dirs"], ignore_error=True) # Second pass: search in sim_cfg dict, this time not ignoring errors. self.__dict__ = find_and_substitute_wildcards( self.__dict__, self.sim_cfg.__dict__, ignored_wildcards=["cov_db_dirs"], ignore_error=False) # Prune previous merged cov directories. prev_cov_db_dirs = self.odir_limiter(odir=self.cov_merge_db_dir) # If a merged cov data base exists from a previous run, then consider # that as well for merging, if the --cov-merge-previous command line # switch is passed. if self.sim_cfg.cov_merge_previous: self.cov_db_dirs += prev_cov_db_dirs # Append cov_db_dirs to the list of exports. self.exports["cov_db_dirs"] = "\"{}\"".format(self.cov_db_dirs) # Call base class __post_init__ to do checks and substitutions super().__post_init__()
def __init__(self, flow_cfg_file, proj_root, args): super().__init__(flow_cfg_file, proj_root, args) assert args.tool is not None # Options set from command line self.tool = args.tool self.verbose = args.verbose self.flist_gen_cmd = "" self.flist_gen_opts = [] self.sv_flist_gen_dir = "" self.flist_file = "" self.build_cmd = "" self.build_opts = [] self.build_log = "" self.report_cmd = "" self.report_opts = [] self.build_opts.extend(args.build_opts) self.build_unique = args.build_unique self.build_only = args.build_only # Options built from cfg_file files self.project = "" self.flow = "" self.flow_makefile = "" self.scratch_path = "" self.build_dir = "" self.run_dir = "" self.sw_build_dir = "" self.pass_patterns = [] self.fail_patterns = [] self.name = "" self.dut = "" self.fusesoc_core = "" self.ral_spec = "" self.build_modes = [] self.run_modes = [] self.regressions = [] self.max_msg_count = -1 # Flow results self.result = OrderedDict() self.result_summary = OrderedDict() self.dry_run = args.dry_run # Not needed for this build self.verbosity = "" self.en_build_modes = [] # Generated data structures self.links = {} self.build_list = [] self.deploy = [] self.cov = args.cov # Parse the cfg_file file tree self._parse_flow_cfg(flow_cfg_file) # If build_unique is set, then add current timestamp to uniquify it if self.build_unique: self.build_dir += "_" + self.timestamp # Process overrides before substituting the wildcards. self._process_overrides() # Make substitutions, while ignoring the following wildcards # TODO: Find a way to set these in sim cfg instead ignored_wildcards = ["build_mode", "index", "test"] self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__, ignored_wildcards) # Stuff below only pertains to individual cfg (not primary cfg). if not self.is_primary_cfg: # Print scratch_path at the start: log.info("[scratch_path]: [%s] [%s]", self.name, self.scratch_path) # Set directories with links for ease of debug / triage. self.links = { "D": self.scratch_path + "/" + "dispatched", "P": self.scratch_path + "/" + "passed", "F": self.scratch_path + "/" + "failed", "K": self.scratch_path + "/" + "killed" } # Use the default build mode for tests that do not specify it if not hasattr(self, "build_mode"): setattr(self, "build_mode", "default") # Create objects from raw dicts - build_modes, sim_modes, run_modes, # tests and regressions, only if not a primary cfg obj self._create_objects() # Post init checks self.__post_init__()
def __init__(self, flow_cfg_file, proj_root, args): super().__init__(flow_cfg_file, proj_root, args) # Options set from command line self.tool = args.tool self.build_opts = [] self.build_opts.extend(args.build_opts) self.en_build_modes = args.build_modes.copy() self.run_opts = [] self.run_opts.extend(args.run_opts) self.en_run_modes = [] self.en_run_modes.extend(args.run_modes) self.build_unique = args.build_unique self.build_only = args.build_only self.run_only = args.run_only self.reseed_ovrd = args.reseed self.reseed_multiplier = args.reseed_multiplier self.waves = args.waves self.max_waves = args.max_waves self.cov = args.cov self.cov_merge_previous = args.cov_merge_previous self.profile = args.profile or '(cfg uses profile without --profile)' self.xprop_off = args.xprop_off self.no_rerun = args.no_rerun # Single-character verbosity setting (n, l, m, h, d). args.verbosity # might be None, in which case we'll pick up a default value from # configuration files. self.verbosity = args.verbosity self.verbose = args.verbose self.dry_run = args.dry_run self.map_full_testplan = args.map_full_testplan # Disable cov if --build-only is passed. if self.build_only: self.cov = False # Set default sim modes for unpacking if self.waves is True: self.en_build_modes.append("waves") if self.cov is True: self.en_build_modes.append("cov") if args.profile is not None: self.en_build_modes.append("profile") if self.xprop_off is not True: self.en_build_modes.append("xprop") # Options built from cfg_file files self.project = "" self.flow = "" self.flow_makefile = "" self.build_dir = "" self.run_dir = "" self.sw_build_dir = "" self.pass_patterns = [] self.fail_patterns = [] self.name = "" self.dut = "" self.tb = "" self.testplan = "" self.fusesoc_core = "" self.ral_spec = "" self.build_modes = [] self.run_modes = [] self.regressions = [] # Options from tools - for building and running tests self.build_cmd = "" self.flist_gen_cmd = "" self.flist_gen_opts = [] self.flist_file = "" self.run_cmd = "" # Generated data structures self.links = {} self.build_list = [] self.run_list = [] self.cov_merge_deploy = None self.cov_report_deploy = None self.results_summary = OrderedDict() # If is_primary_cfg is set, then each cfg will have its own cov_deploy. # Maintain an array of those in cov_deploys. self.cov_deploys = [] # Parse the cfg_file file tree self._parse_flow_cfg(flow_cfg_file) # Choose a dump format now. Note that this has to happen after parsing # the configuration format because our choice might depend on the # chosen tool. self.dump_fmt = (resolve_dump_format(self.tool, args.dump) if self.waves and not self.is_primary_cfg else 'none') # If build_unique is set, then add current timestamp to uniquify it if self.build_unique: self.build_dir += "_" + self.timestamp # Process overrides before substituting the wildcards. self._process_overrides() # Make substitutions, while ignoring the following wildcards # TODO: Find a way to set these in sim cfg instead ignored_wildcards = [ "build_mode", "index", "test", "seed", "uvm_test", "uvm_test_seq", "cov_db_dirs", "sw_test", "sw_test_is_prebuilt", "sw_build_device" ] self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__, ignored_wildcards, self.is_primary_cfg) # Set the title for simulation results. self.results_title = self.name.upper() + " Simulation Results" # Stuff below only pertains to individual cfg (not primary cfg) # or individual selected cfgs (if select_cfgs is configured via command line) # TODO: find a better way to support select_cfgs if not self.is_primary_cfg and (not self.select_cfgs or self.name in self.select_cfgs): # If self.tool is None at this point, there was no --tool argument on # the command line, and there is no default tool set in the config # file. That's ok if this is a primary config (where the # sub-configurations can choose tools themselves), but not otherwise. if self.tool is None: log.error( 'Config file does not specify a default tool, ' 'and there was no --tool argument on the command line.') sys.exit(1) # Print info: log.info("[scratch_dir]: [%s]: [%s]", self.name, self.scratch_path) # Set directories with links for ease of debug / triage. self.links = { "D": self.scratch_path + "/" + "dispatched", "P": self.scratch_path + "/" + "passed", "F": self.scratch_path + "/" + "failed", "K": self.scratch_path + "/" + "killed" } # Use the default build mode for tests that do not specify it if not hasattr(self, "build_mode"): self.build_mode = 'default' # Create objects from raw dicts - build_modes, sim_modes, run_modes, # tests and regressions, only if not a primary cfg obj self._create_objects() # Post init checks self.__post_init__()
def __init__(self, flow_cfg_file, proj_root, args): super().__init__(flow_cfg_file, proj_root, args) # Options set from command line self.tool = args.tool self.build_opts = [] self.build_opts.extend(args.build_opts) self.en_build_modes = [] self.en_build_modes.extend(args.build_modes) self.run_opts = [] self.run_opts.extend(args.run_opts) self.en_run_modes = [] self.en_run_modes.extend(args.run_modes) self.build_unique = args.build_unique self.build_only = args.build_only self.run_only = args.run_only self.reseed_ovrd = args.reseed self.reseed_multiplier = args.reseed_multiplier self.waves = args.waves self.dump = args.dump self.max_waves = args.max_waves self.cov = args.cov self.cov_merge_previous = args.cov_merge_previous self.profile = args.profile self.xprop_off = args.xprop_off self.no_rerun = args.no_rerun self.verbosity = "{" + args.verbosity + "}" self.verbose = args.verbose self.dry_run = args.dry_run self.map_full_testplan = args.map_full_testplan # Disable cov if --build-only is passed. if self.build_only: self.cov = False # Set default sim modes for unpacking if self.waves is True: self.en_build_modes.append("waves") if self.cov is True: self.en_build_modes.append("cov") if self.profile != 'none': self.en_build_modes.append("profile") if self.xprop_off is not True: self.en_build_modes.append("xprop") # Options built from cfg_file files self.project = "" self.flow = "" self.flow_makefile = "" self.build_dir = "" self.run_dir = "" self.sw_build_dir = "" self.pass_patterns = [] self.fail_patterns = [] self.name = "" self.dut = "" self.tb = "" self.testplan = "" self.fusesoc_core = "" self.ral_spec = "" self.build_modes = [] self.run_modes = [] self.regressions = [] # Options from tools - for building and running tests self.build_cmd = "" self.flist_gen_cmd = "" self.flist_gen_opts = [] self.flist_file = "" self.run_cmd = "" self.dump_file = "" # Generated data structures self.links = {} self.build_list = [] self.run_list = [] self.cov_merge_deploy = None self.cov_report_deploy = None self.results_summary = OrderedDict() # If is_master_cfg is set, then each cfg will have its own cov_deploy. # Maintain an array of those in cov_deploys. self.cov_deploys = [] # Parse the cfg_file file tree self.parse_flow_cfg(flow_cfg_file) self._post_parse_flow_cfg() # If build_unique is set, then add current timestamp to uniquify it if self.build_unique: self.build_dir += "_" + self.timestamp # Process overrides before substituting the wildcards. self._process_overrides() # Make substitutions, while ignoring the following wildcards # TODO: Find a way to set these in sim cfg instead ignored_wildcards = [ "build_mode", "index", "test", "seed", "uvm_test", "uvm_test_seq", "cov_db_dirs", "sw_dir", "sw_name", "sw_build_device" ] self.__dict__ = find_and_substitute_wildcards(self.__dict__, self.__dict__, ignored_wildcards, self.is_master_cfg) # Set the title for simulation results. self.results_title = self.name.upper() + " Simulation Results" # Stuff below only pertains to individual cfg (not master cfg) # or individual selected cfgs (if select_cfgs is configured via command line) # TODO: find a better way to support select_cfgs if not self.is_master_cfg and (not self.select_cfgs or self.name in self.select_cfgs): # Print info: log.info("[scratch_dir]: [%s]: [%s]", self.name, self.scratch_path) # Set directories with links for ease of debug / triage. self.links = { "D": self.scratch_path + "/" + "dispatched", "P": self.scratch_path + "/" + "passed", "F": self.scratch_path + "/" + "failed", "K": self.scratch_path + "/" + "killed" } # Use the default build mode for tests that do not specify it if not hasattr(self, "build_mode"): setattr(self, "build_mode", "default") self._process_exports() # Create objects from raw dicts - build_modes, sim_modes, run_modes, # tests and regressions, only if not a master cfg obj self._create_objects() # Post init checks self.__post_init__()