Source code for netlistx.readwrite

"""Readers for IBM-PLACE 2.0 benchmark format (.net + .are).

Port of netlistx-cpp/source/readwrite.cpp readNetD and readAre.
"""
from typing import List

import networkx as nx

from netlistx.netlist import Netlist


[docs] def read_netd(filename: str) -> Netlist: """Read an IBM .net format file and return a Netlist. Header format: 0 numPins numNets numModules padOffset Each entry line: a<id> s|l [netnum] (cell) or p<id> s|l [netnum] (pad) - 's' marks the start of a new net - 'l' continues the current net (connections to the most recent 's' net) """ with open(filename, "r") as f: lines = f.readlines() numPins = int(lines[1].strip()) numNets = int(lines[2].strip()) numModules = int(lines[3].strip()) padOffset = int(lines[4].strip()) total_nodes = numModules + numNets graph = nx.Graph() graph.add_nodes_from(range(numModules), bipartite=0) graph.add_nodes_from(range(numModules, total_nodes), bipartite=1) edgeIdx = numModules - 1 pin_count = 0 for line in lines[5:]: if pin_count >= numPins: break line = line.strip() if not line: continue entry = line.split()[0] kind = entry[0] node = int(entry[1:]) if kind == "p": node += padOffset if " s " in line or line.endswith(" s") or " s\t" in line: edgeIdx += 1 graph.add_edge(node, edgeIdx) pin_count += 1 modules = list(range(numModules)) net_nodes = list(range(numModules, numModules + numNets)) hyprgraph = Netlist(graph, modules, net_nodes) hyprgraph.num_pads = numModules - padOffset - 1 return hyprgraph
[docs] def read_are(hyprgraph: Netlist, filename: str) -> None: """Read an IBM .are format file and update module_weight in-place. Format: a<id> <weight> or p<id> <weight> For pads (p), offset is computed from num_modules - num_pads - 1. """ pad_offset = hyprgraph.num_modules - hyprgraph.num_pads - 1 module_weight: List[int] = [1] * hyprgraph.num_modules with open(filename, "r") as f: for line in f: line = line.strip() if not line: continue parts = line.split() if len(parts) < 2: continue entry = parts[0] weight = int(parts[1]) kind = entry[0] node = int(entry[1:]) if kind == "p": node += pad_offset module_weight[node] = weight hyprgraph.module_weight = module_weight