Tighten routing policy with channel spacing and tie-net fallback
This commit is contained in:
parent
538d137d35
commit
2bda088223
@ -18,7 +18,7 @@ const NET_CLASS_PRIORITY = {
|
|||||||
const LABEL_TIE_CLASSES = new Set(["power", "ground", "bus"]);
|
const LABEL_TIE_CLASSES = new Set(["power", "ground", "bus"]);
|
||||||
const DEFAULT_RENDER_MODE = "schematic_stub";
|
const DEFAULT_RENDER_MODE = "schematic_stub";
|
||||||
const ROTATION_STEPS = [0, 90, 180, 270];
|
const ROTATION_STEPS = [0, 90, 180, 270];
|
||||||
const MIN_CHANNEL_SPACING_STEPS = 2;
|
const MIN_CHANNEL_SPACING_STEPS = 3;
|
||||||
const LANE_ORDER = ["power", "clock", "signal", "analog", "ground", "bus", "differential"];
|
const LANE_ORDER = ["power", "clock", "signal", "analog", "ground", "bus", "differential"];
|
||||||
|
|
||||||
function toGrid(value) {
|
function toGrid(value) {
|
||||||
@ -1190,7 +1190,7 @@ function uniquePoints(points) {
|
|||||||
return [...map.values()];
|
return [...map.values()];
|
||||||
}
|
}
|
||||||
|
|
||||||
function routeLabelTieNet(net, pinNodes, context) {
|
function routeLabelTieNet(net, pinNodes, context, fallbackReason = null) {
|
||||||
const routes = [];
|
const routes = [];
|
||||||
const tiePoints = [];
|
const tiePoints = [];
|
||||||
|
|
||||||
@ -1239,7 +1239,7 @@ function routeLabelTieNet(net, pinNodes, context) {
|
|||||||
total_bends: 0,
|
total_bends: 0,
|
||||||
detour_ratio: 1,
|
detour_ratio: 1,
|
||||||
used_label_tie: true,
|
used_label_tie: true,
|
||||||
fallback_reason: null
|
fallback_reason: fallbackReason
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1493,6 +1493,9 @@ function shouldUseLabelTie(net, pinNodes, context) {
|
|||||||
const span = Math.abs(maxX - minX) + Math.abs(maxY - minY);
|
const span = Math.abs(maxX - minX) + Math.abs(maxY - minY);
|
||||||
|
|
||||||
if (context.renderMode === "explicit") {
|
if (context.renderMode === "explicit") {
|
||||||
|
if (context.busNetNames.has(net.name) && (pinNodes.length >= 3 || span > GRID * 36)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return LABEL_TIE_CLASSES.has(net.class) && pinNodes.length > 2;
|
return LABEL_TIE_CLASSES.has(net.class) && pinNodes.length > 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1517,6 +1520,26 @@ function shouldUseLabelTie(net, pinNodes, context) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shouldFallbackToTieByQuality(net, pinNodes, routed) {
|
||||||
|
if (!routed || routed.mode !== "routed") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const stats = routed.route_stats ?? {};
|
||||||
|
const detour = Number(stats.detour_ratio ?? 1);
|
||||||
|
const bends = Number(stats.total_bends ?? 0);
|
||||||
|
const totalLength = Number(stats.total_length ?? 0);
|
||||||
|
const directLength = Number(stats.direct_length ?? totalLength);
|
||||||
|
const spanRatio = directLength > 0 ? totalLength / directLength : 1;
|
||||||
|
|
||||||
|
if (pinNodes.length >= 4 && (detour > 2.25 || bends >= 7)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ((net.class === "analog" || net.class === "signal") && pinNodes.length >= 3 && spanRatio > 2.7) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
function routeAllNets(model, placed, placedMap, bounds, options) {
|
function routeAllNets(model, placed, placedMap, bounds, options) {
|
||||||
const obstacles = buildObstacles(model, placed);
|
const obstacles = buildObstacles(model, placed);
|
||||||
const edgeUsage = new Map();
|
const edgeUsage = new Map();
|
||||||
@ -1551,10 +1574,14 @@ function routeAllNets(model, placed, placedMap, bounds, options) {
|
|||||||
busNetNames
|
busNetNames
|
||||||
};
|
};
|
||||||
|
|
||||||
const routed = shouldUseLabelTie(net, pinNodes, routeContext)
|
let routed = shouldUseLabelTie(net, pinNodes, routeContext)
|
||||||
? routeLabelTieNet(net, pinNodes, routeContext)
|
? routeLabelTieNet(net, pinNodes, routeContext)
|
||||||
: routePointToPointNet(net, pinNodes, routeContext);
|
: routePointToPointNet(net, pinNodes, routeContext);
|
||||||
|
|
||||||
|
if (shouldFallbackToTieByQuality(net, pinNodes, routed)) {
|
||||||
|
routed = routeLabelTieNet(net, pinNodes, routeContext, "quality_policy");
|
||||||
|
}
|
||||||
|
|
||||||
routedByName.set(net.name, {
|
routedByName.set(net.name, {
|
||||||
net,
|
net,
|
||||||
isBusMember: busNetNames.has(net.name),
|
isBusMember: busNetNames.has(net.name),
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 173 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 172 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 166 KiB |
Loading…
Reference in New Issue
Block a user