#!/usr/bin/env python3 import csv import os import re import shutil import sys from collections import defaultdict, namedtuple from itertools import groupby from jinja2 import Environment, FileSystemLoader, select_autoescape from pathlib import Path env = Environment( loader=FileSystemLoader("."), trim_blocks=True, lstrip_blocks=True, autoescape=select_autoescape(['html', 'xml']) ) def index_by_header(rows): item_keys = rows[0] items = {k: {} for idx, k in enumerate(item_keys) if idx > 0} fields = set() for r_idx, row in enumerate(rows): for c_idx, cell in enumerate(row): if c_idx == 0: field = cell fields.add(field) else: key = item_keys[c_idx] item = items[key] item[field] = cell return fields, items def table_to_map(table, keys_in: str = None): if keys_in == "rows": data = {} fields = table[0] for row in table[1:]: key = row[0] data[key] = o = {} for idx, cell in enumerate(row): field = fields[idx] o[field] = cell return data else: raise Exception("unknown keys_in value: {}".format(keys_in)) def read_csv(f, remove_notes = True): table = [row for row in csv.reader(f) if not row[0].startswith("#") and len(row[0]) > 0] if remove_notes: r = r"\([0-9]+\)" table[0] = [re.sub(r, "", name) for name in table[0]] table[0] = [name.strip() for name in table[0]] return table dbg = lambda x: '' dbg = print p = print Package = namedtuple("Package", "name size pitch") PartPackage = namedtuple("PartPackage", "part package gtx hr hp") packages = {} part_packages = {} with open("part-packages.csv") as f: rows = read_csv(f) # for r in rows: # print(r) package_indexes = [(idx, part) for idx, part in enumerate(rows[0]) if idx > 0 and len(part)] for idx, part in package_indexes: name = rows[0][idx] size = rows[1][idx] pitch = rows[1][idx] packages[name] = Package(name, size, pitch) print("Packages") [print(" {}".format(p)) for p in packages] r = r"\([0-9]+\)" for row in rows[3:]: part = row[0] part_packages[part] = info = {} for idx, package in package_indexes: gtx = row[idx] hr = row[idx + 1] hp = row[idx + 2] if len(gtx) == 0: continue info[package] = PartPackage(part, package, gtx, hr, hp) print("Part/packages") for part, packages in part_packages.items(): print(" {}:".format(part)) for pp in packages.values(): print(" {}: gtx: {}, hr: {}, hp: {}".format(pp.package, pp.gtx, pp.hr, pp.hp)) if False: sys.exit(1) with open("parts.csv") as f: table = read_csv(f) parts = table_to_map(table, keys_in="rows") out_dir = Path("mw") if out_dir.exists(): shutil.rmtree(out_dir) out_dir.mkdir() print("parts") for part, info in parts.items(): print(info) for part in parts.values(): part_number = part["Device"] print("--- PART: {} ---".format(part_number)) path = out_dir / "Chip:{}.mw".format(part_number) with open(path, "w") as out: template = env.get_template("mw.j2") out.write(template.render(part=part)) for field in part: print(field)