#!/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 with open("temperatures.csv") as f: rows = list(csv.reader(f)) Temperature = namedtuple("Temperature", rows[0]) temperatures = {row[0]: Temperature(*row) for row in rows[1:]} print("Temperatures") for t in temperatures.values(): print(t) with open("packages.csv") as f: rows = list(csv.reader(f)) Package = namedtuple("Package", [r.lower().replace(" ", "_") for r in rows[0]]) packages = [Package(*r) for r in rows[1:]] print("Packages") for p in packages: print(p) with open("package-devices.csv") as f: rows = read_csv(f) # for r in rows: # print(r) r = r"\([0-9]+\)" package_idx = {int(idx): re.sub(r, "", part) for idx, part in enumerate(rows[0]) if len(part) and idx > 0} io_by_part = {} for row in rows[1:]: part = row[0] io_by_part[part] = info = {} for idx, package in package_idx.items(): transceivers = row[idx] if len(transceivers) == 0: continue pins = row[idx + 1] info[package] = (package, pins, transceivers) # print("package={}, pins={}, tx={}".format(package, pins, transceivers)) print("IO") for part, info in io_by_part.items(): print(part) for package, pins, tx in info.values(): print(" {}: pins: {}, transceivers: {}".format(package, pins, tx)) 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 rows.items(): # print(info) for part in parts.values(): part_number = part["Part number"] 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)