"""PinList generator — converts a validated PinMAP into a flat pin list. Usage ----- >>> from pinlist_generator import generate_pinlist >>> pinlist = generate_pinlist(pinmap, validation) """ from models import PinMAP, PinList, ValidationResult def generate_pinlist(pinmap: PinMAP, validation: ValidationResult) -> PinList: """Generate a PinList from a PinMAP. Rules ----- - ``A1`` cell holds the package-info string. - Column A = PinName, Column B = Pin number. - Rows are sorted by pin number in ascending order. - Missing PinNames (flagged as warnings) default to ``"NC"``. Parameters ---------- pinmap : PinMAP A parsed pin map. validation : ValidationResult The validation result (used to identify pins with missing names). Returns ------- PinList """ # Build a set of pin numbers that have missing names missing_numbers = set() for warn in validation.warnings: if "缺失引脚序号" in warn.details: # Parse the details string: "缺失引脚序号: [1, 3, 5],将默认为 NC" import re match = re.search(r"缺失引脚序号:\s*\[([^\]]+)\]", warn.details) if match: for num_str in match.group(1).split(","): num_str = num_str.strip() if num_str: missing_numbers.add(int(num_str)) # Build rows: replace missing names with "NC", sort by pin number rows: list[tuple[str, int]] = [] for pin in pinmap.pins: pin_name = pin.name if pin.name and pin.name.strip() else "NC" # Override if validator flagged it if pin.number in missing_numbers: pin_name = "NC" rows.append((pin_name, pin.number)) # Sort by pin number (ascending) rows.sort(key=lambda r: r[1]) return PinList( package_info=pinmap.package_info, rows=rows, )