Skip to content

Commit 3cfd6ff

Browse files
committed
KLayout mods based on new info
Signed-off-by: Jeff Ng <[email protected]>
1 parent e5d7c19 commit 3cfd6ff

File tree

4 files changed

+30
-16
lines changed

4 files changed

+30
-16
lines changed

flow/scripts/klayout/src/KLayoutTechFileGenerator.rb

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ def initialize(name, description, layer_properties_file)
4242
# 1) KLayout only writes out one mapping per layer, so we only add the
4343
# first occurrence of the layer into the map. This is usually datatype
4444
# == 0
45-
# 2) KLayout doesn't support layers that start with a number in its maps,
46-
# so we prepend an "a" to the layer name. These layers are typically
47-
# not seen in the LEF, so it should be a no-op
4845
#
4946
def get_layer_map(sorted_layer_map)
5047
layer_map = LayerMap.new()
@@ -53,7 +50,9 @@ def get_layer_map(sorted_layer_map)
5350
layer_list.each do |layer_info|
5451
gds_info = layer_info.gds
5552
if layer_name.match?(/\A\d/)
56-
layer_name = "a" + layer_name
53+
# single quote escaping required for layers that start
54+
# with a digit
55+
layer_name = "'" + layer_name + "'"
5756
end
5857
map_str = sprintf("%s:%d/%d", layer_name, gds_info.layer,
5958
gds_info.datatype)
@@ -73,13 +72,12 @@ def add_via_connectivity(lef_file, sorted_layer_map)
7372
via_data = LEFViaData.new()
7473
via_data.read_file(lef_file)
7574
connectivity = @tech.component("connectivity")
76-
# Generally works, except it adds an extra definition for the first
77-
# connection
78-
via_data.get_map().each do | key, layer_stack |
75+
via_data.get_map().each do | via_name, layer_stack |
7976
lower_layer = layer_stack[0]
8077
via_layer = layer_stack[1]
8178
upper_layer = layer_stack[2]
8279
connection = NetTracerConnectivity.new
80+
connection.name = via_name
8381
connection.connection(lower_layer, via_layer, upper_layer)
8482
connectivity.add(connection)
8583
end

flow/scripts/klayout/src/LEFViaData.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ def read_via(fh, via_name)
6262
layer_stack = []
6363
while (line = fh.gets)
6464
if line.match("^\s*END")
65-
key = layer_stack.join("_")
65+
#key = layer_stack.join("_")
66+
key = via_name
6667
@via_map[key] = layer_stack
6768
return
6869
end

flow/scripts/klayout/test/KLayoutLayerMapGeneratorTest.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,18 @@ def setup
2424
def test_basic
2525
data_str = <<~LM_TEXT
2626
# Bogus sample layer map
27-
M1 drawing 99 0 # M1
28-
M1 net 99 23 # M1_NET
29-
M1 net2 99 23 # M1_NET
27+
M1 drawing 99 0 # M1
28+
M1 net 99 23 # M1_NET
29+
M1 net2 99 23 # M1_NET
30+
1Layer drawing 123 99 # 1Layer
3031
LM_TEXT
3132

3233
data_stream = StringIO.new(data_str)
3334
@rep.read(data_stream)
3435
layer_map = @rep.get_map()
3536
assert(layer_map)
36-
assert(layer_map.length == 2)
37+
assert(layer_map.length == 3)
38+
# Test M1 entry
3739
layer_list = layer_map["M1"]
3840
assert(layer_list.length == 1)
3941
entry = layer_list[0]
@@ -42,6 +44,7 @@ def test_basic
4244
assert(entry.cds_lpp.purpose_name == "drawing")
4345
assert(entry.gds.layer == 99)
4446
assert(entry.gds.datatype == 0)
47+
# Test M1 NET entry
4548
layer_list = layer_map["M1_NET"]
4649
assert(layer_list.length == 2)
4750
layer_list.each do | entry |
@@ -51,5 +54,13 @@ def test_basic
5154
assert(entry.gds.layer == 99)
5255
assert(entry.gds.datatype == 23)
5356
end
57+
# Test 1Layer entry
58+
layer_list = layer_map["1Layer"]
59+
assert(layer_list.length == 1)
60+
entry = layer_list[0]
61+
assert(entry.cds_lpp.layer_name == "1Layer")
62+
assert(entry.cds_lpp.purpose_name == "drawing")
63+
assert(entry.gds.layer == 123)
64+
assert(entry.gds.datatype == 99)
5465
end
5566
end

flow/scripts/klayout/test/LEFViaDataTest.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,20 @@ def test_basic
3838
RECT -0.02 -0.02 0.02 0.02 ;
3939
END VIA89
4040
VIA_TEXT
41-
41+
42+
exp_layers = {
43+
"VIA9Pad" => [ "M9", "Pad", "V9" ],
44+
"VIA89" => [ "M8", "V8", "M9" ],
45+
}
46+
4247
data_stream = StringIO.new(data_str)
4348
@rep.read(data_stream)
4449
via_map = @rep.get_map()
4550
assert(via_map)
4651
assert(via_map.length == 2,
4752
sprintf("via map length is not 2: %d", via_map.length))
48-
via_map.each do | key, layer_list |
49-
tokens = key.split("_")
50-
assert(tokens.sort == layer_list.sort)
53+
via_map.each do | via_name, layer_list |
54+
assert(exp_layers[via_name].sort == layer_list.sort)
5155
end
5256
end
5357
end

0 commit comments

Comments
 (0)