Skip to content

Commit 2fef9f8

Browse files
authored
Implement most of the cells (#142)
1 parent 49cdf33 commit 2fef9f8

File tree

4 files changed

+65
-36
lines changed

4 files changed

+65
-36
lines changed

src/asic.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,25 @@ pub fn asic_rewrites() -> Vec<egg::Rewrite<CellLang, CellAnalysis>> {
289289

290290
// Standard Cells
291291

292-
rules.push(rewrite!("nor2_x1"; "(INV (OR ?a ?b))" => "(NOR2_X1 ?a ?b)"));
292+
rules.push(rewrite!("and2_x1"; "(AND ?a ?b)" => "(AND2_X1 ?a ?b)"));
293293
rules.push(rewrite!("nand2_x1"; "(INV (AND ?a ?b))" => "(NAND2_X1 ?a ?b)"));
294+
rules.push(rewrite!("or2_x1"; "(OR ?a ?b)" => "(OR2_X1 ?a ?b)"));
295+
rules.push(rewrite!("nor2_x1"; "(INV (OR ?a ?b))" => "(NOR2_X1 ?a ?b)"));
296+
rules
297+
.push(rewrite!("xor2_x1"; "(OR (AND ?b (INV ?a)) (AND ?a (INV ?b)))" => "(XOR2_X1 ?a ?b)"));
298+
rules.push(
299+
rewrite!("xnor2_x1"; "(OR (AND ?b ?a) (AND (INV ?a) (INV ?b)))" => "(XNOR2_X1 ?a ?b)"),
300+
);
301+
rules.push(rewrite!("and3_x1"; "(AND (AND ?a ?b) ?c)" => "(AND3_X1 ?a ?b ?c)"));
302+
rules.push(rewrite!("nand3_x1"; "(INV (AND (AND ?a ?b) ?c))" => "(NAND3_X1 ?a ?b ?c)"));
303+
rules.push(rewrite!("or3_x1"; "(OR (OR ?a ?b) ?c)" => "(OR3_X1 ?a ?b ?c)"));
304+
rules.push(rewrite!("nor3_x1"; "(INV (OR (OR ?a ?b) ?c))" => "(NOR3_X1 ?a ?b ?c)"));
305+
rules.push(rewrite!("and4_x1"; "(AND (AND ?a ?b) (AND ?c ?d))" => "(AND4_X1 ?a ?b ?c ?d)"));
294306
rules.push(
295307
rewrite!("nand4_x1"; "(INV (AND (AND ?a ?b) (AND ?c ?d)))" => "(NAND4_X1 ?a ?b ?c ?d)"),
296308
);
297-
rules
298-
.push(rewrite!("xor2_x1"; "(OR (AND ?b (INV ?a)) (AND ?a (INV ?b)))" => "(XOR2_X1 ?a ?b)"));
309+
rules.push(rewrite!("or4_x1"; "(OR (OR ?a ?b) (OR ?c ?d))" => "(OR4_X1 ?a ?b ?c ?d)"));
310+
rules.push(rewrite!("nor4_x1"; "(INV (OR (OR ?a ?b) (OR ?c ?d)))" => "(NOR4_X1 ?a ?b ?c ?d)"));
299311
rules.push(rewrite!("inv_x1"; "(INV ?a)" => "(INV_X1 ?a)"));
300312
rules.push(rewrite!("aoi21_x1"; "(INV (OR (AND ?b ?c) ?a))" => "(AOI21_X1 ?a ?b ?c)"));
301313
rules.push(rewrite!("oai21_x1"; "(INV (AND (OR ?b ?c) ?a))" => "(OAI21_X1 ?a ?b ?c)"));
@@ -306,11 +318,12 @@ pub fn asic_rewrites() -> Vec<egg::Rewrite<CellLang, CellAnalysis>> {
306318
rewrite!("oai22_x1"; "(INV (AND (OR ?c ?d) (OR ?a ?b)))" => "(OAI22_X1 ?a ?b ?c ?d)"),
307319
);
308320
rules.push(
309-
rewrite!("aoi211_x1"; "(INV (OR ?b (OR (AND ?c ?d) ?a)))" => "(AOI211_X1 ?a ?b ?c ?d)"),
321+
rewrite!("aoi211_x1"; "(INV (OR ?a (OR (AND ?c ?d) ?b)))" => "(AOI211_X1 ?a ?b ?c ?d)"),
310322
);
311323
rules.push(
312-
rewrite!("oai211_x1"; "(INV (AND ?b (AND (OR ?c ?d) ?a)))" => "(OAI211_X1 ?a ?b ?c ?d)"),
324+
rewrite!("oai211_x1"; "(INV (AND ?a (AND (OR ?c ?d) ?b)))" => "(OAI211_X1 ?a ?b ?c ?d)"),
313325
);
326+
rules.push(rewrite!("mux2_x1"; "(OR (AND (INV ?s) ?b) (AND ?s ?a))" => "(MUX2_X1 ?s ?a ?b)"));
314327

315328
rules
316329
}

src/bin/optcell.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ fn main() -> std::io::Result<()> {
199199

200200
#[test]
201201
fn simple_tests() {
202-
assert_eq!(simplify("(AND a b)"), "(INV_X1 (NAND2_X1 a b))");
202+
assert_eq!(simplify("(AND a b)"), "(AND2_X1 a b)");
203203
assert_eq!(simplify("(INV a)"), "(INV_X1 a)");
204204
assert_eq!(simplify("(AND a true)"), "a");
205205
}

src/verilog.rs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,16 @@ pub enum PrimitiveType {
215215
NOR2,
216216
XOR2,
217217
XNOR2,
218+
AND3,
219+
NAND3,
220+
OR3,
221+
NOR3,
218222
AND4,
219223
NAND4,
220224
OR4,
221225
NOR4,
222-
XOR4,
223-
XNOR4,
224226
MUX,
227+
MUX2,
225228
MUXF7,
226229
MUXF8,
227230
MUXF9,
@@ -253,8 +256,9 @@ impl PrimitiveType {
253256
Self::XOR2 | Self::XOR => 2,
254257
Self::XNOR2 | Self::XNOR => 2,
255258
Self::NOT | Self::INV | Self::LUT1 => 1,
256-
Self::MUX | Self::MUXF7 | Self::MUXF8 | Self::MUXF9 => 3,
257-
Self::AND4 | Self::NAND4 | Self::OR4 | Self::NOR4 | Self::XOR4 | Self::XNOR4 => 4,
259+
Self::MUX | Self::MUX2 | Self::MUXF7 | Self::MUXF8 | Self::MUXF9 => 3,
260+
Self::AND3 | Self::NAND3 | Self::OR3 | Self::NOR3 => 3,
261+
Self::AND4 | Self::NAND4 | Self::OR4 | Self::NOR4 => 4,
258262
Self::AOI21 | Self::OAI21 => 3,
259263
Self::AOI211 | Self::AOI22 | Self::OAI211 | Self::OAI22 => 4,
260264
Self::LUT2 => 2,
@@ -270,14 +274,24 @@ impl PrimitiveType {
270274
/// Get the list of inputs for the primitive
271275
pub fn get_input_list(&self) -> Vec<String> {
272276
match self {
273-
Self::AND | Self::NAND | Self::OR | Self::NOR | Self::XOR | Self::XNOR => {
277+
Self::AND
278+
| Self::NAND
279+
| Self::OR
280+
| Self::NOR
281+
| Self::XOR
282+
| Self::XNOR
283+
| Self::XOR2
284+
| Self::XNOR2 => {
274285
vec!["A".to_string(), "B".to_string()]
275286
}
276287
Self::INV | Self::NOT => vec!["A".to_string()],
277-
Self::AND2 | Self::NAND2 | Self::OR2 | Self::NOR2 | Self::XOR2 | Self::XNOR2 => {
288+
Self::AND2 | Self::NAND2 | Self::OR2 | Self::NOR2 => {
278289
vec!["A1".to_string(), "A2".to_string()]
279290
}
280-
Self::AND4 | Self::NAND4 | Self::OR4 | Self::NOR4 | Self::XOR4 | Self::XNOR4 => {
291+
Self::AND3 | Self::NAND3 | Self::OR3 | Self::NOR3 => {
292+
vec!["A1".to_string(), "A2".to_string(), "A3".to_string()]
293+
}
294+
Self::AND4 | Self::NAND4 | Self::OR4 | Self::NOR4 => {
281295
vec![
282296
"A1".to_string(),
283297
"A2".to_string(),
@@ -288,6 +302,9 @@ impl PrimitiveType {
288302
Self::MUX => {
289303
vec!["S".to_string(), "A".to_string(), "B".to_string()]
290304
}
305+
Self::MUX2 => {
306+
vec!["S".to_string(), "B".to_string(), "A".to_string()]
307+
}
291308
Self::MUXF7 | Self::MUXF8 | Self::MUXF9 => {
292309
vec!["S".to_string(), "I1".to_string(), "I0".to_string()]
293310
}
@@ -356,6 +373,7 @@ impl PrimitiveType {
356373
Self::VCC => "P".to_string(),
357374
Self::GND => "G".to_string(),
358375
Self::FDRE => "Q".to_string(),
376+
Self::MUX2 | Self::XOR2 => "Z".to_string(),
359377
_ => "ZN".to_string(),
360378
}
361379
}
@@ -393,18 +411,21 @@ impl FromStr for PrimitiveType {
393411
"NOR2" => Ok(Self::NOR2),
394412
"XOR2" => Ok(Self::XOR2),
395413
"XNOR2" => Ok(Self::XNOR2),
414+
"AND3" => Ok(Self::AND3),
415+
"NAND3" => Ok(Self::NAND3),
416+
"OR3" => Ok(Self::OR3),
417+
"NOR3" => Ok(Self::NOR3),
396418
"AND4" => Ok(Self::AND4),
397419
"NAND4" => Ok(Self::NAND4),
398420
"OR4" => Ok(Self::OR4),
399421
"NOR4" => Ok(Self::NOR4),
400-
"XOR4" => Ok(Self::XOR4),
401-
"XNOR4" => Ok(Self::XNOR4),
402422
"AOI21" => Ok(Self::AOI21),
403423
"OAI21" => Ok(Self::OAI21),
404424
"AOI211" => Ok(Self::AOI211),
405425
"AOI22" => Ok(Self::AOI22),
406426
"OAI211" => Ok(Self::OAI211),
407427
"OAI22" => Ok(Self::OAI22),
428+
"MUX2" => Ok(Self::MUX2),
408429
_ => Err(format!("Unknown primitive type {}", l)),
409430
},
410431
None => match s {

tests/asic/cla.v

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,42 +74,37 @@ module cla (
7474
.Y(c2)
7575
);
7676

77-
// CHECK: NAND2_X1 #(
78-
// CHECK: ) __5__ (
79-
// CHECK: .A1(a0),
80-
// CHECK: .A2(b0),
77+
// CHECK: AOI22_X1 #(
78+
// CHECK: ) __4__ (
79+
// CHECK: .A1(a1),
80+
// CHECK: .A2(b1),
81+
// CHECK: .B1(a0),
82+
// CHECK: .B2(b0),
8183
// CHECK: .ZN(__0__)
8284
// CHECK: );
8385
// CHECK: OAI21_X1 #(
84-
// CHECK: ) __6__ (
86+
// CHECK: ) __5__ (
8587
// CHECK: .A(c0),
8688
// CHECK: .B1(a0),
8789
// CHECK: .B2(b0),
8890
// CHECK: .ZN(__1__)
8991
// CHECK: );
90-
// CHECK: NAND2_X1 #(
91-
// CHECK: ) __7__ (
92+
// CHECK: AND2_X1 #(
93+
// CHECK: ) __6__ (
9294
// CHECK: .A1(__1__),
9395
// CHECK: .A2(__0__),
9496
// CHECK: .ZN(__2__)
9597
// CHECK: );
96-
// CHECK: OAI21_X1 #(
97-
// CHECK: ) __8__ (
98-
// CHECK: .A(__2__),
99-
// CHECK: .B1(a1),
100-
// CHECK: .B2(b1),
101-
// CHECK: .ZN(__3__)
102-
// CHECK: );
103-
// CHECK: NAND2_X1 #(
104-
// CHECK: ) __9__ (
98+
// CHECK: NOR2_X1 #(
99+
// CHECK: ) __7__ (
105100
// CHECK: .A1(a1),
106101
// CHECK: .A2(b1),
107-
// CHECK: .ZN(__4__)
102+
// CHECK: .ZN(__3__)
108103
// CHECK: );
109-
// CHECK: NAND2_X1 #(
110-
// CHECK: ) __10__ (
111-
// CHECK: .A1(__4__),
112-
// CHECK: .A2(__3__),
104+
// CHECK: NOR2_X1 #(
105+
// CHECK: ) __8__ (
106+
// CHECK: .A1(__3__),
107+
// CHECK: .A2(__2__),
113108
// CHECK: .ZN(c2)
114109
// CHECK: );
115110

0 commit comments

Comments
 (0)