diff --git a/prjxray/db.py b/prjxray/db.py index 56ea14f0..daecc2ea 100644 --- a/prjxray/db.py +++ b/prjxray/db.py @@ -42,6 +42,8 @@ class Database(object): self.tile_segbits = {} self.site_types = {} + per_part_features = {} + for f in os.listdir(self.db_root): if f.endswith('.json') and f.startswith('tile_type_'): tile_type = f[len('tile_type_'):-len('.json')].lower() @@ -85,15 +87,32 @@ class Database(object): self.site_types[site_type_name] = os.path.join(self.db_root, f) + if f.endswith('_required_features.fasm'): + part = f[:-len('_required_features.fasm')] + + with open(os.path.join(self.db_root, f), "r") as fp: + features = [] + for line in fp: + line = line.strip() + if len(line) > 0: + features.append(line) + + per_part_features[part] = set(features) + self.tile_types_obj = {} - # Load set of required fasm features for given part. - self.required_features = {} - fname = os.path.join(self.db_root, "required_features.json") + # Find common required features for all supported parts + if len(per_part_features) > 0: + common_features = set.intersection(*per_part_features.values()) + for features in per_part_features.values(): + features -= common_features + else: + common_features = set() - if os.path.isfile(fname): - with open(fname, "r") as fp: - self.required_features = json.load(fp) + self.required_features = { + "always_required": common_features, + "per_part_required": per_part_features + } def get_tile_types(self): """ Return list of tile types """ @@ -171,16 +190,8 @@ class Database(object): if "always_required" in self.required_features: features |= set(self.required_features["always_required"]) - # Append / remove features for the specific part. If a feature string - # starts with "-" then the feature needs not to be present for that - # part. + # Append list of part specific features if part is not None: - for f in self.required_features["per_part_required"][part]: - - if f.startswith("-"): - f = f[1:] - features -= set([f]) - else: - features |= set([f]) + features |= set(self.required_features["per_part_required"][part]) return features diff --git a/utils/fasm2frames.py b/utils/fasm2frames.py index 8776103d..f540fc7e 100755 --- a/utils/fasm2frames.py +++ b/utils/fasm2frames.py @@ -81,6 +81,7 @@ def find_pudc_b(db): def run( db_root, + part, filename_in, f_out, sparse=False, @@ -121,8 +122,7 @@ def run( '\n'.join(roi_j['required_features'])) # Get required extra features for the part - # TODO: Specify the part explicitly ? - required_features = db.get_required_fasm_features(None) + required_features = db.get_required_fasm_features(part) extra_features += fasm.parse_fasm_string('\n'.join(required_features)) assembler.parse_fasm_filename(filename_in, extra_features=extra_features) @@ -170,7 +170,13 @@ def main(): db_root_kwargs['required'] = False db_root_kwargs['default'] = os.path.join(database_dir, database) + def_part = os.getenv("XRAY_PART") + parser.add_argument('--db-root', help="Database root.", **db_root_kwargs) + parser.add_argument( + '--part', + default=def_part, + help="Part name. When not given defaults to XRAY_PART env. var.") parser.add_argument( '--sparse', action='store_true', help="Don't zero fill all frames") parser.add_argument( @@ -192,6 +198,7 @@ def main(): args = parser.parse_args() run( db_root=args.db_root, + part=args.part, filename_in=args.fn_in, f_out=open(args.fn_out, 'w'), sparse=args.sparse,