Skip to content

Commit 7a6140f

Browse files
authored
Improved support for >128 sizes (#78)
* Initial adjustments to hierarchy creation * Verified legacy as working with new variable names * Fix for experimental >128
1 parent c7206e5 commit 7a6140f

File tree

7 files changed

+61
-61
lines changed

7 files changed

+61
-61
lines changed

dffram.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,8 @@ def main():
858858
flow()
859859
except subprocess.CalledProcessError as e:
860860
print("A step has failed:", e)
861+
print("Invokable:")
862+
print(' '.join(e.cmd))
861863
exit(69)
862864
except Exception:
863865
print("An unhandled exception has occurred.", traceback.format_exc())

placeram/cli.py

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@
3838
print("You need to install pyyaml: python3 -m pip install pyyank")
3939
exit(78)
4040

41-
from .util import eprint
42-
from .placeable import override_regex_dict
43-
from .data import Block, Slice, Word, HigherLevelPlaceable
41+
from . import data
4442
from .row import Row
43+
from .util import eprint
4544
from .reg_data import DFFRF
45+
from .placeable import override_regex_dict
4646

4747
import os
4848
import re
@@ -109,28 +109,7 @@ def create_fill(name, sites=1):
109109
if regFile:
110110
self.hierarchy = DFFRF(self.instances)
111111
else:
112-
includes = {32:r"\bBANK_B(\d+)\b",
113-
128: r"\bBANK128_B(\d+)\b",
114-
512: r"\bBANK512_B(\d+)\b"}
115-
116-
if word_count == 1:
117-
self.hierarchy = Word(self.instances)
118-
elif word_count == 8:
119-
self.hierarchy = Slice(self.instances)
120-
elif word_count == 32:
121-
self.hierarchy = Block(self.instances)
122-
elif word_count == 128:
123-
self.hierarchy = \
124-
HigherLevelPlaceable(includes[32], self.instances)
125-
elif word_count == 512:
126-
self.hierarchy = \
127-
HigherLevelPlaceable(includes[128], self.instances)
128-
elif word_count == 1024:
129-
self.hierarchy = \
130-
HigherLevelPlaceable(includes[512], self.instances)
131-
elif word_count == 2048:
132-
self.hierarchy = \
133-
HigherLevelPlaceable(includes[512], self.instances)
112+
self.hierarchy = data.create_hierarchy(self.instances, word_count)
134113

135114
def represent(self, file):
136115
self.hierarchy.represent(file=file)

placeram/data.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ def place(self, row_list: List[Row], start_row: int = 0):
628628

629629
class HigherLevelPlaceable(Placeable):
630630
# TODO: Dual ported higher level placeables.
631-
def __init__(self, inner_re: RegExp, instances: List[Instance]):
631+
def __init__(self, instances: List[Instance], block_size: int):
632632
self.clkbuf: Instance = None
633633
self.enbuf: Instance = None
634634
self.blocks: List[Union[Block, HigherLevelPlaceable]] = None
@@ -646,14 +646,12 @@ def __init__(self, inner_re: RegExp, instances: List[Instance]):
646646

647647
raw_domux: List[Instance] = []
648648

649-
r_block = inner_re
650-
651649
m = NS()
652650
r = self.regexes()
653651

654652
for instance in instances:
655653
n = instance.getName()
656-
if sarv(m, "block_match", re.search(r_block, n)):
654+
if sarv(m, "block_match", re.search(getattr(r, str(block_size)), n)):
657655
i = int(m.block_match[1])
658656
raw_blocks[i] = raw_blocks.get(i) or []
659657
raw_blocks[i].append(instance)
@@ -677,7 +675,9 @@ def __init__(self, inner_re: RegExp, instances: List[Instance]):
677675
raw_domux.append(instance)
678676
else:
679677
raise DataError("Unknown element in %s: %s" % (type(self).__name__, n))
680-
self.blocks = d2a({k: constructor[inner_re](v) for k, v in
678+
679+
680+
self.blocks = d2a({k: create_hierarchy(v, block_size) for k, v in
681681
raw_blocks.items()})
682682
self.decoder_ands = d2a(raw_decoder_ands)
683683
self.dibufs = d2a(raw_dibufs)
@@ -772,8 +772,23 @@ def symmetrically_placeable(obj):
772772
def word_count(self):
773773
return len(self.blocks) * (self.blocks[0].word_count())
774774

775-
constructor = {
776-
r"\bBANK_B(\d+)\b": Block,
777-
r"\bBANK128_B(\d+)\b": partial(HigherLevelPlaceable, r"\bBANK_B(\d+)\b"),
778-
r"\bBANK512_B(\d+)\b": partial(HigherLevelPlaceable, r"\bBANK128_B(\d+)\b")
779-
}
775+
def create_hierarchy(instances, word_count):
776+
hierarchy = None
777+
if word_count == 1:
778+
hierarchy = Word(instances)
779+
elif word_count == 8:
780+
hierarchy = Slice(instances)
781+
elif word_count == 32:
782+
hierarchy = Block(instances)
783+
else:
784+
"""
785+
I derived this equation based on the structure we have.
786+
Feel free to independently verify it.
787+
788+
Valid for 128 <= 𝒙 <= 2048:
789+
790+
𝒚 = 32 * 4 ^ ⌈log2(𝒙 / 128) / 2⌉
791+
"""
792+
block_size = 32 * (4 ** math.ceil(math.log2(word_count / 128) / 2))
793+
hierarchy = HigherLevelPlaceable(instances, block_size)
794+
return hierarchy

placeram/rx.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ Block:
3535
floatbuf: "\\bBYTE\\\\\\[(\\d+)\\\\\\]\\.FLOATBUF(\\d*)\\\\\\[(\\d+)\\\\\\]"
3636
Mux:
3737
selbuf: "\\bSEL(\\d*)?BUF\\\\\\[(\\d+)\\\\\\]"
38-
mux: "\\bMUX(\\d+)\\\\\\[(\\d+)\\\\\\]"
38+
mux: "\\bM\\\\\\[(\\d+)\\\\\\]\\.MUX\\\\\\[(\\d+)\\\\\\]"
3939
HigherLevelPlaceable:
40+
"32": "\\bBLOCK\\\\\\[(\\d+)\\\\\\]"
41+
"128": "\\bBANK128\\\\\\[(\\d+)\\\\\\]"
42+
"512": "\\bBANK512\\\\\\[(\\d+)\\\\\\]"
4043
clkbuf: "\\bCLKBUF\\b"
4144
enbuf: "\\bENBUF\\b"
4245
decoder_and: "\\bDEC\\.AND(\\d+)\\b"

platforms/sky130A/BB/ram/legacy/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ variants:
66
- null
77
rx_overrides:
88
Block.floatbuf: "\\bFLOATBUF_B(\\d+)\\\\(\\d*)\\[(\\d+)\\\\]"
9+
Mux.mux: "\\bMUX(\\d+)\\\\\\[(\\d+)\\\\\\]"
910
Word.byte: "\\bB(\\d+)\\b"

platforms/sky130A/BB/ram/legacy/model.v

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ module RAM32 #(parameter USE_LATCH=1) (
239239
generate
240240
genvar i;
241241
for (i=0; i< 4; i=i+1) begin : SLICE
242-
RAM8 #(.USE_LATCH(USE_LATCH)) RAM8x32 (.CLK(CLK_buf), .WE(WE_buf),.EN(SEL[i]), .Di(Di_buf), .Do(Do_pre), .A(A_buf[2:0]) );
242+
RAM8 #(.USE_LATCH(USE_LATCH)) RAM8 (.CLK(CLK_buf), .WE(WE_buf),.EN(SEL[i]), .Di(Di_buf), .Do(Do_pre), .A(A_buf[2:0]) );
243243
end
244244
endgenerate
245245

@@ -289,10 +289,10 @@ module RAM128 #(parameter USE_LATCH=1) (
289289
DEC2x4 DEC (.EN(EN_buf), .A(A_buf[6:5]), .SEL(SEL));
290290

291291
// 32x32 RAM Banks
292-
RAM32 #(.USE_LATCH(USE_LATCH)) BANK_B0 (.CLK(CLK_buf), .EN(SEL[0]), .WE(WE_buf), .Di(Di_buf), .Do(Do_0), .A(A_buf[4:0]) );
293-
RAM32 #(.USE_LATCH(USE_LATCH)) BANK_B1 (.CLK(CLK_buf), .EN(SEL[1]), .WE(WE_buf), .Di(Di_buf), .Do(Do_1), .A(A_buf[4:0]) );
294-
RAM32 #(.USE_LATCH(USE_LATCH)) BANK_B2 (.CLK(CLK_buf), .EN(SEL[2]), .WE(WE_buf), .Di(Di_buf), .Do(Do_2), .A(A_buf[4:0]) );
295-
RAM32 #(.USE_LATCH(USE_LATCH)) BANK_B3 (.CLK(CLK_buf), .EN(SEL[3]), .WE(WE_buf), .Di(Di_buf), .Do(Do_3), .A(A_buf[4:0]) );
292+
RAM32 #(.USE_LATCH(USE_LATCH)) \BLOCK[0].RAM32 (.CLK(CLK_buf), .EN(SEL[0]), .WE(WE_buf), .Di(Di_buf), .Do(Do_0), .A(A_buf[4:0]) );
293+
RAM32 #(.USE_LATCH(USE_LATCH)) \BLOCK[1].RAM32 (.CLK(CLK_buf), .EN(SEL[1]), .WE(WE_buf), .Di(Di_buf), .Do(Do_1), .A(A_buf[4:0]) );
294+
RAM32 #(.USE_LATCH(USE_LATCH)) \BLOCK[2].RAM32 (.CLK(CLK_buf), .EN(SEL[2]), .WE(WE_buf), .Di(Di_buf), .Do(Do_2), .A(A_buf[4:0]) );
295+
RAM32 #(.USE_LATCH(USE_LATCH)) \BLOCK[3].RAM32 (.CLK(CLK_buf), .EN(SEL[3]), .WE(WE_buf), .Di(Di_buf), .Do(Do_3), .A(A_buf[4:0]) );
296296

297297
// Output MUX
298298
MUX4x1_32 DoMUX ( .A0(Do_0), .A1(Do_1), .A2(Do_2), .A3(Do_3), .S(A_buf[6:5]), .X(Do) );
@@ -328,10 +328,10 @@ module RAM512 #(parameter USE_LATCH=1) (
328328
DEC2x4 DEC (.EN(EN_buf), .A(A_buf[8:7]), .SEL(SEL));
329329

330330
// 128x32 RAM Banks
331-
RAM128 #(.USE_LATCH(USE_LATCH)) BANK128_B0 (.CLK(CLK_buf), .EN(SEL[0]), .WE(WE_buf), .Di(Di_buf), .Do(Do_0), .A(A_buf[6:0]) );
332-
RAM128 #(.USE_LATCH(USE_LATCH)) BANK128_B1 (.CLK(CLK_buf), .EN(SEL[1]), .WE(WE_buf), .Di(Di_buf), .Do(Do_1), .A(A_buf[6:0]) );
333-
RAM128 #(.USE_LATCH(USE_LATCH)) BANK128_B2 (.CLK(CLK_buf), .EN(SEL[2]), .WE(WE_buf), .Di(Di_buf), .Do(Do_2), .A(A_buf[6:0]) );
334-
RAM128 #(.USE_LATCH(USE_LATCH)) BANK128_B3 (.CLK(CLK_buf), .EN(SEL[3]), .WE(WE_buf), .Di(Di_buf), .Do(Do_3), .A(A_buf[6:0]) );
331+
RAM128 #(.USE_LATCH(USE_LATCH)) \BANK128[0].RAM128 (.CLK(CLK_buf), .EN(SEL[0]), .WE(WE_buf), .Di(Di_buf), .Do(Do_0), .A(A_buf[6:0]) );
332+
RAM128 #(.USE_LATCH(USE_LATCH)) \BANK128[1].RAM128 (.CLK(CLK_buf), .EN(SEL[1]), .WE(WE_buf), .Di(Di_buf), .Do(Do_1), .A(A_buf[6:0]) );
333+
RAM128 #(.USE_LATCH(USE_LATCH)) \BANK128[2].RAM128 (.CLK(CLK_buf), .EN(SEL[2]), .WE(WE_buf), .Di(Di_buf), .Do(Do_2), .A(A_buf[6:0]) );
334+
RAM128 #(.USE_LATCH(USE_LATCH)) \BANK128[3].RAM128 (.CLK(CLK_buf), .EN(SEL[3]), .WE(WE_buf), .Di(Di_buf), .Do(Do_3), .A(A_buf[6:0]) );
335335

336336
// Output MUX
337337
MUX4x1_32 DoMUX ( .A0(Do_0), .A1(Do_1), .A2(Do_2), .A3(Do_3), .S(A_buf[8:7]), .X(Do) );
@@ -382,10 +382,10 @@ module RAM2048 #(parameter USE_LATCH=1) (
382382
DEC2x4 DEC (.EN(EN), .A(A[10:9]), .SEL(SEL));
383383

384384
// 32x32 RAM Banks
385-
RAM512 #(.USE_LATCH(USE_LATCH)) BANK512_B0 (.CLK(CLK), .EN(SEL[0]), .WE(WE), .Di(Di), .Do(Do_0), .A(A[8:0]) );
386-
RAM512 #(.USE_LATCH(USE_LATCH)) BANK512_B1 (.CLK(CLK), .EN(SEL[1]), .WE(WE), .Di(Di), .Do(Do_1), .A(A[8:0]) );
387-
RAM512 #(.USE_LATCH(USE_LATCH)) BANK512_B2 (.CLK(CLK), .EN(SEL[2]), .WE(WE), .Di(Di), .Do(Do_2), .A(A[8:0]) );
388-
RAM512 #(.USE_LATCH(USE_LATCH)) BANK512_B3 (.CLK(CLK), .EN(SEL[3]), .WE(WE), .Di(Di), .Do(Do_3), .A(A[8:0]) );
385+
RAM512 #(.USE_LATCH(USE_LATCH)) \BANK512[0].RAM512 (.CLK(CLK), .EN(SEL[0]), .WE(WE), .Di(Di), .Do(Do_0), .A(A[8:0]) );
386+
RAM512 #(.USE_LATCH(USE_LATCH)) \BANK512[1].RAM512 (.CLK(CLK), .EN(SEL[1]), .WE(WE), .Di(Di), .Do(Do_1), .A(A[8:0]) );
387+
RAM512 #(.USE_LATCH(USE_LATCH)) \BANK512[2].RAM512 (.CLK(CLK), .EN(SEL[2]), .WE(WE), .Di(Di), .Do(Do_2), .A(A[8:0]) );
388+
RAM512 #(.USE_LATCH(USE_LATCH)) \BANK512[3].RAM512 (.CLK(CLK), .EN(SEL[3]), .WE(WE), .Di(Di), .Do(Do_3), .A(A[8:0]) );
389389

390390
// Output MUX
391391
MUX4x1_32 DoMUX ( .A0(Do_0), .A1(Do_1), .A2(Do_2), .A3(Do_3), .S(A[10:9]), .X(Do) );

platforms/sky130A/BB/ram/model.v

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ module RAM256 #(parameter USE_LATCH=1,
563563

564564
generate
565565
genvar i;
566-
for (i=0; i< 2; i=i+1) begin : BLOCK
566+
for (i=0; i< 2; i=i+1) begin : BANK128
567567
RAM128 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM128 (.CLK(CLK), .EN0(SEL0[i]), .WE0(WE0), .Di0(Di0), .Do0(Do0_pre[i]), .A0(A0[6:0]) );
568568
end
569569
endgenerate
@@ -597,7 +597,7 @@ module RAM256_1RW1R #(parameter USE_LATCH=1,
597597

598598
generate
599599
genvar i;
600-
for (i=0; i< 2; i=i+1) begin : BLOCK
600+
for (i=0; i< 2; i=i+1) begin : BANK128
601601
RAM128_1RW1R #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM128 (.CLK(CLK), .EN0(SEL0[i]), .EN1(SEL1[i]), .WE0(WE0), .Di0(Di0), .Do0(Do0_pre[i]), .Do1(Do1_pre[i]), .A0(A0[6:0]), .A1(A1[6:0]) );
602602
end
603603
endgenerate
@@ -628,7 +628,7 @@ module RAM512 #(parameter USE_LATCH=1,
628628

629629
generate
630630
genvar i;
631-
for (i=0; i< 4; i=i+1) begin : BLOCK
631+
for (i=0; i< 4; i=i+1) begin : BANK128
632632
RAM128 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM128 (.CLK(CLK),
633633
.EN0(SEL0[i]),
634634
.WE0(WE0),
@@ -673,7 +673,7 @@ module RAM512_1RW1R #(parameter USE_LATCH=1,
673673

674674
generate
675675
genvar i;
676-
for (i=0; i< 4; i=i+1) begin : BLOCK
676+
for (i=0; i< 4; i=i+1) begin : BANK128
677677
RAM128_1RW1R #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM128 (.CLK(CLK), .EN0(SEL0[i]), .EN1(SEL1[i]), .WE0(WE0), .Di0(Di0), .Do0(Do0_pre[i]), .Do1(Do1_pre[i]), .A0(A0[6:0]), .A1(A1[6:0]) );
678678
end
679679
endgenerate
@@ -717,8 +717,8 @@ module RAM1024 #(parameter USE_LATCH=1,
717717

718718
generate
719719
genvar i;
720-
for (i=0; i< 2; i=i+1) begin : BLOCK
721-
RAM512 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM32 (.CLK(CLK_buf), .EN0(SEL0[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .A0(A0_buf[8:0]) );
720+
for (i=0; i< 2; i=i+1) begin : BANK512
721+
RAM512 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM512 (.CLK(CLK_buf), .EN0(SEL0[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .A0(A0_buf[8:0]) );
722722
end
723723
endgenerate
724724

@@ -768,8 +768,8 @@ module RAM1024_1RW1R #(parameter USE_LATCH=1,
768768

769769
generate
770770
genvar i;
771-
for (i=0; i< 2; i=i+1) begin : BLOCK
772-
RAM512_1RW1R #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM32 (.CLK(CLK_buf), .EN0(SEL0[i]), .EN1(SEL1[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .Do1(Do1_pre[i]), .A0(A0_buf[8:0]), .A1(A1_buf[8:0]) );
771+
for (i=0; i< 2; i=i+1) begin : BANK512
772+
RAM512_1RW1R #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM512 (.CLK(CLK_buf), .EN0(SEL0[i]), .EN1(SEL1[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .Do1(Do1_pre[i]), .A0(A0_buf[8:0]), .A1(A1_buf[8:0]) );
773773
end
774774
endgenerate
775775

@@ -811,8 +811,8 @@ module RAM2048 #(parameter USE_LATCH=1,
811811

812812
generate
813813
genvar i;
814-
for (i=0; i< 4; i=i+1) begin : BLOCK
815-
RAM512 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM32 (.CLK(CLK_buf), .EN0(SEL0[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .A0(A0_buf[8:0]) );
814+
for (i=0; i< 4; i=i+1) begin : BANK512
815+
RAM512 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM512 (.CLK(CLK_buf), .EN0(SEL0[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .A0(A0_buf[8:0]) );
816816
end
817817
endgenerate
818818

@@ -861,8 +861,8 @@ module RAM2048_1RW1R #(parameter USE_LATCH=1,
861861

862862
generate
863863
genvar i;
864-
for (i=0; i< 4; i=i+1) begin : BLOCK
865-
RAM512_1RW1R #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM32_1RW1R (.CLK(CLK_buf), .EN0(SEL0[i]), .EN1(SEL1[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .Do1(Do1_pre[i]), .A0(A0_buf[8:0]), .A1(A1_buf[8:0]) );
864+
for (i=0; i< 4; i=i+1) begin : BANK512
865+
RAM512_1RW1R #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM512 (.CLK(CLK_buf), .EN0(SEL0[i]), .EN1(SEL1[i]), .WE0(WE0_buf), .Di0(Di0_buf), .Do0(Do0_pre[i]), .Do1(Do1_pre[i]), .A0(A0_buf[8:0]), .A1(A1_buf[8:0]) );
866866
end
867867
endgenerate
868868

0 commit comments

Comments
 (0)