Skip to content

Commit f289e91

Browse files
authored
Merge pull request #10604 from gadfort/colors-backside
gui/web: use random colors on backside layers to preserve color order on frontside metals
2 parents e50dbd2 + d683546 commit f289e91

3 files changed

Lines changed: 108 additions & 27 deletions

File tree

src/gui/src/displayControls.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,29 +2134,33 @@ void DisplayControls::techInit(odb::dbTech* tech)
21342134
for (dbTechLayer* layer : tech->getLayers()) {
21352135
dbTechLayerType type = layer->getType();
21362136
QColor color;
2137-
if (type == dbTechLayerType::ROUTING) {
2138-
if (metal < default_metal_colors.size()) {
2139-
color = default_metal_colors[metal++];
2140-
} else {
2141-
// pick a random color as we exceeded the built-in palette size
2142-
color = generate_next_color();
2143-
}
2144-
} else if (type == dbTechLayerType::CUT) {
2145-
if (via < default_cut_colors.size()) {
2146-
if (metal != 0) {
2147-
color = default_cut_colors[via++];
2137+
if (layer->isBackside()) {
2138+
color = generate_next_color();
2139+
} else {
2140+
if (type == dbTechLayerType::ROUTING) {
2141+
if (metal < default_metal_colors.size()) {
2142+
color = default_metal_colors[metal++];
21482143
} else {
2149-
// via came first, so pick random color
2144+
// pick a random color as we exceeded the built-in palette size
2145+
color = generate_next_color();
2146+
}
2147+
} else if (type == dbTechLayerType::CUT) {
2148+
if (via < default_cut_colors.size()) {
2149+
if (metal != 0) {
2150+
color = default_cut_colors[via++];
2151+
} else {
2152+
// via came first, so pick random color
2153+
color = generate_next_color();
2154+
}
2155+
} else {
2156+
// pick a random color as we exceeded the built-in palette size
21502157
color = generate_next_color();
21512158
}
21522159
} else {
2153-
// pick a random color as we exceeded the built-in palette size
2160+
// Do not draw from the existing palette so the metal layers can claim
2161+
// those colors.
21542162
color = generate_next_color();
21552163
}
2156-
} else {
2157-
// Do not draw from the existing palette so the metal layers can claim
2158-
// those colors.
2159-
color = generate_next_color();
21602164
}
21612165
color.setAlpha(180);
21622166
layer_color_[layer] = std::move(color);

src/web/src/tile_generator.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -952,17 +952,21 @@ static odb::PtrMap<odb::dbTechLayer, Color> buildLayerColorMap(
952952
size_t via = 0;
953953
for (odb::dbTechLayer* layer : tech->getLayers()) {
954954
Color c;
955-
const odb::dbTechLayerType type = layer->getType();
956-
if (type == odb::dbTechLayerType::ROUTING) {
957-
c = (metal < kMetalColors.size()) ? kMetalColors[metal++]
958-
: random_color();
959-
} else if (type == odb::dbTechLayerType::CUT) {
960-
// GUI: a CUT layer that appears before any ROUTING layer gets a random
961-
// color so cuts don't claim the metal palette slots.
962-
c = (via < kCutColors.size() && metal != 0) ? kCutColors[via++]
963-
: random_color();
964-
} else {
955+
if (layer->isBackside()) {
965956
c = random_color();
957+
} else {
958+
const odb::dbTechLayerType type = layer->getType();
959+
if (type == odb::dbTechLayerType::ROUTING) {
960+
c = (metal < kMetalColors.size()) ? kMetalColors[metal++]
961+
: random_color();
962+
} else if (type == odb::dbTechLayerType::CUT) {
963+
// GUI: a CUT layer that appears before any ROUTING layer gets a random
964+
// color so cuts don't claim the metal palette slots.
965+
c = (via < kCutColors.size() && metal != 0) ? kCutColors[via++]
966+
: random_color();
967+
} else {
968+
c = random_color();
969+
}
966970
}
967971
colors[layer] = c;
968972
}

src/web/test/cpp/TestTileGenerator.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,79 @@ TEST_F(TileGeneratorTest, GetLayerColorMapMatchesGuiPalette)
290290
}
291291
}
292292

293+
// Only frontside metals should consume the palette colors.
294+
TEST_F(TileGeneratorTest, GetLayerColorMapWithBacksideMetals)
295+
{
296+
odb::dbTech* tech = getDb()->getTech();
297+
ASSERT_NE(tech, nullptr);
298+
299+
// make metals 1 -> 3 backside
300+
for (const char* name :
301+
{"metal1", "via1", "metal2", "via2", "metal3", "via3"}) {
302+
odb::dbTechLayer* layer = tech->findLayer(name);
303+
ASSERT_NE(layer, nullptr) << "missing layer " << name;
304+
layer->setBackside(true);
305+
}
306+
307+
makeTileGen();
308+
const auto& colors = tile_gen_->getLayerColorMap();
309+
310+
// Helper: assert a layer's color matches an expected RGB (alpha is always
311+
// 180 in both the GUI and the web palette).
312+
auto expectColor = [&](const char* name, int r, int g, int b) {
313+
odb::dbTechLayer* layer = tech->findLayer(name);
314+
ASSERT_NE(layer, nullptr) << "missing layer " << name;
315+
const Color c = colors.at(layer);
316+
EXPECT_EQ(c.r, r) << name << " red";
317+
EXPECT_EQ(c.g, g) << name << " green";
318+
EXPECT_EQ(c.b, b) << name << " blue";
319+
EXPECT_EQ(c.a, 180) << name << " alpha";
320+
};
321+
322+
struct LayerColor
323+
{
324+
const char* name;
325+
int r;
326+
int g;
327+
int b;
328+
};
329+
330+
// All 20 routing layers: metal1..metal14 are the seeded kMetalColors palette
331+
// (#00F, #F00, #0D0, ...), metal15..metal20 are the mt19937(1) overflow.
332+
const LayerColor kRouting[] = {// Backside
333+
{"metal1", 209, 191, 141},
334+
{"metal2", 63, 193, 166},
335+
{"metal3", 200, 166, 92},
336+
// Frontside
337+
{"metal4", 0, 0, 254},
338+
{"metal5", 254, 0, 0},
339+
{"metal6", 9, 221, 0},
340+
{"metal7", 190, 244, 81},
341+
{"metal8", 222, 33, 96},
342+
{"metal9", 32, 216, 253}};
343+
344+
// All 19 cut layers: via1..via14 are the seeded kCutColors palette,
345+
// via15..via19 are the mt19937(1) overflow.
346+
const LayerColor kCut[] = {// Backside
347+
{"via1", 99, 98, 82},
348+
{"via2", 171, 152, 190},
349+
{"via3", 54, 196, 143},
350+
// Frontside
351+
{"via4", 126, 126, 255},
352+
{"via5", 255, 126, 126},
353+
{"via6", 4, 110, 0},
354+
{"via7", 95, 122, 40},
355+
{"via8", 111, 17, 48},
356+
{"via9", 16, 108, 126}};
357+
358+
for (const LayerColor& lc : kRouting) {
359+
expectColor(lc.name, lc.r, lc.g, lc.b);
360+
}
361+
for (const LayerColor& lc : kCut) {
362+
expectColor(lc.name, lc.r, lc.g, lc.b);
363+
}
364+
}
365+
293366
TEST_F(TileGeneratorTest, GetLayerColorMapIsCached)
294367
{
295368
makeTileGen();

0 commit comments

Comments
 (0)