From 3b80e6477089567543d8eeda7f2b62fbb82e76cf Mon Sep 17 00:00:00 2001 From: Thomas Kramer <code@tkramer.ch> Date: Thu, 23 Feb 2023 08:54:16 +0100 Subject: [PATCH] separate function for setting terminal costs --- lclayout/router.py | 57 +++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/lclayout/router.py b/lclayout/router.py index de990f0..c43aa67 100644 --- a/lclayout/router.py +++ b/lclayout/router.py @@ -463,30 +463,7 @@ class DefaultRouter(): assert False, 'Routing graph is not connected.' # Set via weights based on terminal costs. - regions_by_layer = { - # Convert Shapes objects into db.Region for fast 'inside' checks. - layer: db.Region(s) for layer, s in shapes.items() - } - for net, ts in terminals_by_net: - for terminal_node in ts: - layer, (x, y) = terminal_node - possible_via_layers = (data['layer'] for _, _, data in via_layers.edges(layer, data=True)) - - for via_layer in possible_via_layers: - via_cost = compute_terminal_cost( - via_layer, - layer, - (x, y), - regions_by_layer[layer], - tech - ) - - other_node = via_layer, (x, y) # Node on the other side of the via. - - if terminal_node in graph and other_node in graph: - # Scale the via cost - graph[terminal_node][other_node]['weight'] *= via_cost + 1 - + _set_terminal_costs(graph, shapes, terminals_by_net, tech) self._routing_graph = graph @@ -640,6 +617,38 @@ class DefaultRouter(): # Merge the polygons on all layers. # _merge_all_layers(shapes) + +def _set_terminal_costs( + graph: nx.Graph, + shapes: Dict[str, db.Shape], + terminals_by_net: Dict[str, List] +): + """ + Set via weights based on terminal costs. + """ + regions_by_layer = { + # Convert Shapes objects into db.Region for fast 'inside' checks. + layer: db.Region(s) for layer, s in shapes.items() + } + for net, ts in terminals_by_net: + for terminal_node in ts: + layer, (x, y) = terminal_node + possible_via_layers = (data['layer'] for _, _, data in via_layers.edges(layer, data=True)) + + for via_layer in possible_via_layers: + via_cost = compute_terminal_cost( + via_layer, + layer, + (x, y), + regions_by_layer[layer], + tech + ) + + other_node = via_layer, (x, y) # Node on the other side of the via. + + if terminal_node in graph and other_node in graph: + # Scale the via cost + graph[terminal_node][other_node]['weight'] *= via_cost + 1 def _report_track_usage(xs: List[int], ys: List[int], routing_trees: Dict[Any, nx.Graph]): """ -- GitLab