Skip to content

Commit 1b60bd6

Browse files
committed
add SYNTHESIS guard
1 parent aa1c16b commit 1b60bd6

2 files changed

Lines changed: 45 additions & 19 deletions

File tree

lib/Conversion/SimToSV/SimToSV.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ struct SimConversionState {
6565
bool usedSynthesisMacro = false;
6666
bool usedFileDescriptorRuntime = false;
6767
SetVector<StringAttr> dpiCallees;
68+
llvm::SmallDenseMap<Block *, sv::IfDefOp> synthesisGuards;
6869
};
6970

7071
struct SimTypeConverter : public TypeConverter {
@@ -267,14 +268,27 @@ static LogicalResult convert(PauseOp op, PatternRewriter &rewriter) {
267268
return success();
268269
}
269270

270-
class TriggeredLowering : public OpConversionPattern<TriggeredOp> {
271+
class TriggeredLowering : public SimConversionPattern<TriggeredOp> {
271272
public:
272-
using OpConversionPattern<TriggeredOp>::OpConversionPattern;
273+
using SimConversionPattern<TriggeredOp>::SimConversionPattern;
273274

274275
LogicalResult
275276
matchAndRewrite(TriggeredOp op, OpAdaptor adaptor,
276277
ConversionPatternRewriter &rewriter) const final {
277278
auto loc = op.getLoc();
279+
state.usedSynthesisMacro = true;
280+
281+
auto [it, inserted] = state.synthesisGuards.try_emplace(op->getBlock());
282+
auto ifdefOp = it->second;
283+
if (!inserted) {
284+
ifdefOp->moveBefore(op);
285+
} else {
286+
ifdefOp = sv::IfDefOp::create(
287+
rewriter, loc, "SYNTHESIS", [] {}, [] {});
288+
it->second = ifdefOp;
289+
}
290+
rewriter.setInsertionPointToEnd(ifdefOp.getElseBlock());
291+
278292
auto trigger = seq::FromClockOp::create(rewriter, loc, adaptor.getClock());
279293
auto alwaysOp = sv::AlwaysOp::create(
280294
rewriter, loc, ArrayRef<sv::EventControl>{sv::EventControl::AtPosEdge},
@@ -869,7 +883,7 @@ struct SimToSVPass : public circt::impl::LowerSimToSVBase<SimToSVPass> {
869883
patterns.add<ClockedPauseOp>(convert);
870884
patterns.add<TerminateOp>(convert);
871885
patterns.add<PauseOp>(convert);
872-
patterns.add<TriggeredLowering>(typeConverter, context);
886+
patterns.add<TriggeredLowering>(context, state);
873887
patterns.add<DPICallLowering>(context, state);
874888
auto result = applyPartialConversion(module, target, std::move(patterns));
875889

test/Conversion/SimToSV/triggered.mlir

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ hw.module @simple_triggered(in %clock : !seq.clock) {
66
"some.user"() : () -> ()
77
}
88

9-
// CHECK: %[[CLOCK:.*]] = seq.from_clock %clock
10-
// CHECK-NEXT: sv.always posedge %[[CLOCK]] {
11-
// CHECK-NEXT: "some.user"() : () -> ()
9+
// CHECK: sv.ifdef @SYNTHESIS {
10+
// CHECK-NEXT: } else {
11+
// CHECK-NEXT: %[[CLOCK:.*]] = seq.from_clock %clock
12+
// CHECK-NEXT: sv.always posedge %[[CLOCK]] {
13+
// CHECK-NEXT: "some.user"() : () -> ()
14+
// CHECK-NEXT: }
1215
// CHECK-NEXT: }
1316
}
1417

@@ -19,34 +22,43 @@ hw.module @conditional_triggered(
1922
"some.user"() : () -> ()
2023
}
2124

22-
// CHECK: %[[CLOCK:.*]] = seq.from_clock %clock
23-
// CHECK-NEXT: sv.always posedge %[[CLOCK]] {
24-
// CHECK-NEXT: sv.if %en {
25-
// CHECK-NEXT: "some.user"() : () -> ()
25+
// CHECK: sv.ifdef @SYNTHESIS {
26+
// CHECK-NEXT: } else {
27+
// CHECK-NEXT: %[[CLOCK:.*]] = seq.from_clock %clock
28+
// CHECK-NEXT: sv.always posedge %[[CLOCK]] {
29+
// CHECK-NEXT: sv.if %en {
30+
// CHECK-NEXT: "some.user"() : () -> ()
31+
// CHECK-NEXT: }
2632
// CHECK-NEXT: }
2733
// CHECK-NEXT: }
2834
}
2935

3036
// CHECK-LABEL: hw.module @multiple_triggered
3137
hw.module @multiple_triggered(
32-
in %clock : !seq.clock, in %en : i1) {
38+
in %clock : !seq.clock) {
3339

3440
sim.triggered %clock {
3541
"some.user"() : () -> ()
3642
}
3743

38-
sim.triggered %clock if %en {
44+
%late_cond = "some.value"() : () -> i1
45+
46+
sim.triggered %clock if %late_cond {
3947
"some.user"() : () -> ()
4048
}
4149

42-
// CHECK: %[[CLOCK0:.*]] = seq.from_clock %clock
43-
// CHECK-NEXT: sv.always posedge %[[CLOCK0]] {
44-
// CHECK-NEXT: "some.user"() : () -> ()
45-
// CHECK-NEXT: }
46-
// CHECK: %[[CLOCK1:.*]] = seq.from_clock %clock
47-
// CHECK-NEXT: sv.always posedge %[[CLOCK1]] {
48-
// CHECK-NEXT: sv.if %en {
50+
// CHECK: %[[LATE:.*]] = "some.value"() : () -> i1
51+
// CHECK-NEXT: sv.ifdef @SYNTHESIS {
52+
// CHECK-NEXT: } else {
53+
// CHECK-NEXT: %[[CLOCK0:.*]] = seq.from_clock %clock
54+
// CHECK-NEXT: sv.always posedge %[[CLOCK0]] {
4955
// CHECK-NEXT: "some.user"() : () -> ()
5056
// CHECK-NEXT: }
57+
// CHECK-NEXT: %[[CLOCK1:.*]] = seq.from_clock %clock
58+
// CHECK-NEXT: sv.always posedge %[[CLOCK1]] {
59+
// CHECK-NEXT: sv.if %[[LATE]] {
60+
// CHECK-NEXT: "some.user"() : () -> ()
61+
// CHECK-NEXT: }
62+
// CHECK-NEXT: }
5163
// CHECK-NEXT: }
5264
}

0 commit comments

Comments
 (0)