Skip to content

Commit 6b6c0eb

Browse files
feat: add luna 1
1 parent f705353 commit 6b6c0eb

6 files changed

Lines changed: 181 additions & 67 deletions

File tree

README.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,29 @@ foundry via open PDKs and shuttle services like
2020

2121
## Devices
2222

23+
### Aegis Luna 1
24+
25+
A compact Aegis device targeting GF180MCU via [wafer.space](https://wafer.space)
26+
(1x1 Full slot, 3.93 x 5.12mm die).
27+
28+
| Resource | Count |
29+
|-------------------|---------------|
30+
| LUT4 | ~560 |
31+
| BRAM (128x8) | 33 tiles |
32+
| DSP18 (18x18 MAC) | 33 tiles |
33+
| I/O pads | 104 |
34+
| SerDes | 1 |
35+
| Clock tiles | 1 (4 outputs) |
36+
| Routing tracks | 1 per edge |
37+
38+
```bash
39+
nix build .#luna-1 # Generate IP (SV, JSON, chipdb, techmap)
40+
nix build .#luna-1-tapeout # Full RTL-to-GDS for fab submission
41+
```
42+
2343
### Aegis Terra 1
2444

25-
The first Aegis device, targeting GF180MCU via [wafer.space](https://wafer.space).
45+
A larger Aegis device targeting Sky130.
2646

2747
| Resource | Count |
2848
|-------------------|---------------|

devices.nix

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
aegis-ip-tools,
3+
gf180mcu-pdk,
4+
sky130-pdk,
5+
}:
6+
{
7+
terra-1 = {
8+
ip = aegis-ip-tools.mkIp {
9+
deviceName = "terra_1";
10+
width = 48;
11+
height = 64;
12+
tracks = 4;
13+
serdesCount = 4;
14+
bramColumnInterval = 16;
15+
dspColumnInterval = 24;
16+
clockTileCount = 2;
17+
};
18+
tapeout = {
19+
pdk = sky130-pdk;
20+
clockPeriodNs = 20;
21+
};
22+
};
23+
luna-1 = {
24+
ip = aegis-ip-tools.mkIp {
25+
deviceName = "luna_1";
26+
width = 19;
27+
height = 34;
28+
tracks = 1;
29+
serdesCount = 1;
30+
bramColumnInterval = 9;
31+
dspColumnInterval = 10;
32+
clockTileCount = 1;
33+
};
34+
tapeout = {
35+
pdk = gf180mcu-pdk;
36+
clockPeriodNs = 20;
37+
dieWidthUm = 3930;
38+
dieHeightUm = 5120;
39+
tilePlacementDensities.SerDesTile = 0.5;
40+
};
41+
};
42+
}

flake.nix

Lines changed: 88 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -80,74 +80,99 @@
8080
sky130-pdk = pkgs.callPackage ./pkgs/sky130-pdk { };
8181
};
8282

83-
packages = {
84-
default = pkgs.aegis-ip-tools;
85-
ip-tools = pkgs.aegis-ip-tools;
86-
terra-1 = pkgs.aegis-ip-tools.mkIp {
87-
deviceName = "terra_1";
88-
width = 48;
89-
height = 64;
90-
tracks = 4;
91-
serdesCount = 4;
92-
bramColumnInterval = 16;
93-
dspColumnInterval = 24;
94-
clockTileCount = 2;
95-
};
96-
terra-1-tapeout = self.packages.${system}.terra-1.mkTapeout {
97-
pdk = pkgs.gf180mcu-pdk;
98-
clockPeriodNs = 20;
99-
};
100-
terra-1-deb = self.packages.${system}.terra-1.deb;
101-
terra-1-docker = self.packages.${system}.terra-1.docker;
102-
};
83+
packages =
84+
let
85+
devices = import ./devices.nix {
86+
inherit (pkgs) aegis-ip-tools gf180mcu-pdk sky130-pdk;
87+
};
88+
89+
mkDevicePackages = name: cfg: {
90+
"${name}" = cfg.ip;
91+
"${name}-tapeout" = cfg.ip.mkTapeout cfg.tapeout;
92+
"${name}-deb" = cfg.ip.deb;
93+
"${name}-docker" = cfg.ip.docker;
94+
};
95+
in
96+
{
97+
default = pkgs.aegis-ip-tools;
98+
ip-tools = pkgs.aegis-ip-tools;
99+
}
100+
// lib.foldl' (acc: name: acc // mkDevicePackages name devices.${name}) { } (
101+
builtins.attrNames devices
102+
);
103103

104104
checks =
105105
let
106-
terra-1 = self.packages.${system}.terra-1;
106+
devices = builtins.filter (
107+
name:
108+
let
109+
pkg = self.packages.${system}.${name};
110+
in
111+
pkg ? deviceName && !(pkg ? tileMacros)
112+
) (builtins.attrNames self.packages.${system});
113+
mkDeviceChecks =
114+
name:
115+
let
116+
ip = self.packages.${system}.${name};
117+
tapeout = self.packages.${system}."${name}-tapeout";
118+
in
119+
{
120+
"${name}-blinky" = pkgs.callPackage ./examples/blinky {
121+
aegis-ip = ip;
122+
};
123+
"${name}-blinky-sim" = pkgs.callPackage ./tests/blinky-sim {
124+
aegis-ip = ip;
125+
};
126+
"${name}-counter" = pkgs.callPackage ./tests/counter-verify {
127+
aegis-ip = ip;
128+
};
129+
"${name}-shift-register" = pkgs.callPackage ./tests/shift-register {
130+
aegis-ip = ip;
131+
};
132+
"${name}-logic-gates" = pkgs.callPackage ./tests/logic-gates {
133+
aegis-ip = ip;
134+
};
135+
"${name}-tile-bits" = pkgs.callPackage ./tests/tile-bits-consistency {
136+
aegis-ip = ip;
137+
};
138+
"${name}-synth-equiv-comb" = pkgs.callPackage ./tests/synth-equiv {
139+
aegis-ip = ip;
140+
design = "comb";
141+
};
142+
"${name}-synth-equiv-counter" = pkgs.callPackage ./tests/synth-equiv {
143+
aegis-ip = ip;
144+
design = "counter";
145+
};
146+
"${name}-formal-ip" = pkgs.callPackage ./tests/formal-ip {
147+
aegis-ip = ip;
148+
};
149+
"${name}-gds-verify" = pkgs.callPackage ./tests/gds-verify {
150+
aegis-tapeout = tapeout;
151+
};
152+
};
107153
in
108-
{
109-
terra-1-blinky = pkgs.callPackage ./examples/blinky {
110-
aegis-ip = terra-1;
111-
};
112-
terra-1-blinky-sim = pkgs.callPackage ./tests/blinky-sim {
113-
aegis-ip = terra-1;
114-
};
115-
terra-1-counter = pkgs.callPackage ./tests/counter-verify {
116-
aegis-ip = terra-1;
117-
};
118-
terra-1-shift-register = pkgs.callPackage ./tests/shift-register {
119-
aegis-ip = terra-1;
120-
};
121-
terra-1-logic-gates = pkgs.callPackage ./tests/logic-gates {
122-
aegis-ip = terra-1;
123-
};
124-
# Formal verification checks
125-
terra-1-tile-bits = pkgs.callPackage ./tests/tile-bits-consistency {
126-
aegis-ip = terra-1;
127-
};
128-
terra-1-synth-equiv-comb = pkgs.callPackage ./tests/synth-equiv {
129-
aegis-ip = terra-1;
130-
design = "comb";
131-
};
132-
terra-1-synth-equiv-counter = pkgs.callPackage ./tests/synth-equiv {
133-
aegis-ip = terra-1;
134-
design = "counter";
135-
};
136-
terra-1-formal-ip = pkgs.callPackage ./tests/formal-ip {
137-
aegis-ip = terra-1;
138-
};
139-
terra-1-gds-verify = pkgs.callPackage ./tests/gds-verify {
140-
aegis-tapeout = self.packages.${system}.terra-1-tapeout;
141-
};
142-
};
154+
lib.foldl' (acc: name: acc // mkDeviceChecks name) { } devices;
143155

144-
devShells = {
145-
default = pkgs.aegis-ip-tools.shell;
146-
ip-tools = pkgs.aegis-ip-tools.shell;
147-
terra-1 = self.packages.${system}.terra-1.shell;
148-
terra-1-tapeout = self.packages.${system}.terra-1-tapeout.shell;
149-
terra-1-blinky = self.checks.${system}.terra-1-blinky.shell;
150-
};
156+
devShells =
157+
let
158+
devices = builtins.filter (
159+
name:
160+
let
161+
pkg = self.packages.${system}.${name};
162+
in
163+
pkg ? deviceName && !(pkg ? tileMacros)
164+
) (builtins.attrNames self.packages.${system});
165+
mkDeviceShells = name: {
166+
"${name}" = self.packages.${system}.${name}.shell;
167+
"${name}-tapeout" = self.packages.${system}."${name}-tapeout".shell;
168+
"${name}-blinky" = self.checks.${system}."${name}-blinky".shell;
169+
};
170+
in
171+
{
172+
default = pkgs.aegis-ip-tools.shell;
173+
ip-tools = pkgs.aegis-ip-tools.shell;
174+
}
175+
// lib.foldl' (acc: name: acc // mkDeviceShells name) { } devices;
151176
};
152177
};
153178
}

ip/lib/src/openroad/tcl_emitter.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,10 @@ class OpenroadTclEmitter {
592592

593593
// Then place remaining standard cells (glue logic)
594594
buf.writeln('# Place remaining standard cells');
595-
buf.writeln('global_placement -density \$UTILIZATION');
595+
buf.writeln(
596+
'if {![info exists PLACEMENT_DENSITY]} { set PLACEMENT_DENSITY 0.1 }',
597+
);
598+
buf.writeln('global_placement -density \$PLACEMENT_DENSITY');
596599
buf.writeln('detailed_placement');
597600
buf.writeln();
598601
}
@@ -642,7 +645,10 @@ class OpenroadTclEmitter {
642645
'# Detailed route may fail on offgrid pin shapes from place_pins.',
643646
);
644647
buf.writeln('# If it fails, we still have the global-routed DEF.');
645-
buf.writeln('detailed_route');
648+
buf.writeln(
649+
'if {![info exists DROUTE_END_ITER]} { set DROUTE_END_ITER 8 }',
650+
);
651+
buf.writeln('detailed_route -droute_end_iter \$DROUTE_END_ITER');
646652
buf.writeln();
647653
}
648654

ip/lib/src/openroad/tile_tcl_emitter.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,11 @@ class OpenroadTileTclEmitter {
101101
buf.writeln();
102102

103103
// Placement
104-
buf.writeln('global_placement -density \$TILE_UTIL');
104+
buf.writeln(
105+
'if {![info exists TILE_PLACEMENT_DENSITY]} '
106+
'{ set TILE_PLACEMENT_DENSITY \$TILE_UTIL }',
107+
);
108+
buf.writeln('global_placement -density \$TILE_PLACEMENT_DENSITY');
105109
buf.writeln('detailed_placement');
106110
buf.writeln();
107111

pkgs/aegis-tapeout/default.nix

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ lib.extendMkDerivation {
2626
"gridMarginUm"
2727
"tileUtilization"
2828
"tileDieSizes"
29+
"tilePlacementDensities"
30+
"topPlacementDensity"
31+
"topDetailedRouteIter"
2932
];
3033

3134
extendDrvArgs =
@@ -42,6 +45,9 @@ lib.extendMkDerivation {
4245
gridMarginUm ? 20,
4346
tileUtilization ? 0.85,
4447
tileDieSizes ? { },
48+
tilePlacementDensities ? { },
49+
topPlacementDensity ? 0.1,
50+
topDetailedRouteIter ? 8,
4551
...
4652
}@args:
4753

@@ -186,6 +192,9 @@ lib.extendMkDerivation {
186192
set TILE_DIE_W ${toString effectiveTileDieSizes.${tileModule}.w}
187193
set TILE_DIE_H ${toString effectiveTileDieSizes.${tileModule}.h}
188194
''}
195+
${lib.optionalString (builtins.hasAttr tileModule tilePlacementDensities) ''
196+
set TILE_PLACEMENT_DENSITY ${toString tilePlacementDensities.${tileModule}}
197+
''}
189198
source ${aegis-ip}/${deviceName}-openroad-${tileModule}.tcl
190199
EOF
191200
openroad -threads $NIX_BUILD_CORES -exit pnr.tcl 2>&1 | tee openroad.log
@@ -318,6 +327,8 @@ lib.extendMkDerivation {
318327
set CELL_LIB "${cellLib}"
319328
set MACRO_HALO ${toString macroHaloUm}
320329
set GRID_MARGIN ${toString gridMarginUm}
330+
set PLACEMENT_DENSITY ${toString topPlacementDensity}
331+
set DROUTE_END_ITER ${toString topDetailedRouteIter}
321332
${lib.optionalString (dieWidthUm != null && dieHeightUm != null) ''
322333
set DIE_AREA "0 0 ${toString dieWidthUm} ${toString dieHeightUm}"
323334
''}
@@ -352,6 +363,9 @@ lib.extendMkDerivation {
352363
"gridMarginUm"
353364
"tileUtilization"
354365
"tileDieSizes"
366+
"tilePlacementDensities"
367+
"topPlacementDensity"
368+
"topDetailedRouteIter"
355369
]
356370
// {
357371
inherit name;
@@ -461,6 +475,9 @@ lib.extendMkDerivation {
461475
gridMarginUm
462476
tileUtilization
463477
tileDieSizes
478+
tilePlacementDensities
479+
topPlacementDensity
480+
topDetailedRouteIter
464481
tileMacros
465482
topSynth
466483
topPnr

0 commit comments

Comments
 (0)