188 ImplicitLocOpBuilder &b)
const {
189 TypeSwitch<Operation *>(op)
191 .Case([&](EqLibOp op) {
194 .Case([&](NeqLibOp op) {
197 .Case([&](LtLibOp op) {
200 .Case([&](LeLibOp op) {
203 .Case([&](GtLibOp op) {
206 .Case([&](GeLibOp op) {
209 .Case([&](SltLibOp op) {
212 .Case([&](SleLibOp op) {
215 .Case([&](SgtLibOp op) {
218 .Case([&](SgeLibOp op) {
222 .Case([&](AddLibOp op) {
225 .Case([&](SubLibOp op) {
228 .Case([&](RshLibOp op) {
231 .Case([&](SrshLibOp op) {
234 .Case([&](LshLibOp op) {
237 .Case([&](AndLibOp op) {
240 .Case([&](OrLibOp op) {
243 .Case([&](XorLibOp op) {
246 .Case([&](MuxLibOp op) {
247 auto sel =
wireIn(op.getCond(), op.instanceName(),
248 op.portName(op.getCond()), b);
249 auto tru =
wireIn(op.getTru(), op.instanceName(),
250 op.portName(op.getTru()), b);
251 auto fal =
wireIn(op.getFal(), op.instanceName(),
252 op.portName(op.getFal()), b);
254 auto mux = MuxOp::create(b, sel, tru, fal);
257 wireOut(mux, op.instanceName(), op.portName(op.getOut()), b);
258 wires.append({sel.getInput(), tru.getInput(), fal.getInput(), out});
261 .Case([&](MultPipeLibOp op) {
264 .Case([&](DivUPipeLibOp op) {
267 .Case([&](DivSPipeLibOp op) {
270 .Case([&](RemSPipeLibOp op) {
273 .Case([&](RemUPipeLibOp op) {
277 .Case([&](RegisterOp op) {
279 wireIn(op.getIn(), op.instanceName(), op.portName(op.getIn()), b);
280 auto writeEn =
wireIn(op.getWriteEn(), op.instanceName(),
281 op.portName(op.getWriteEn()), b);
282 auto clk =
wireIn(op.getClk(), op.instanceName(),
283 op.portName(op.getClk()), b);
284 auto reset =
wireIn(op.getReset(), op.instanceName(),
285 op.portName(op.getReset()), b);
286 auto seqClk = seq::ToClockOp::create(b, clk);
288 reg(writeEn, seqClk, reset, op.instanceName() +
"_done_reg", b);
290 wireOut(doneReg, op.instanceName(), op.portName(op.getDone()), b);
293 regCe(in, seqClk, clockEn, reset, op.instanceName() +
"_reg", b);
294 auto out =
wireOut(outReg, op.instanceName(),
"", b);
295 wires.append({in.getInput(), writeEn.getInput(), clk.getInput(),
296 reset.getInput(), out, done});
299 .Case([&](SliceLibOp op) {
301 wireIn(op.getIn(), op.instanceName(), op.portName(op.getIn()), b);
302 auto outWidth = op.getOut().getType().getIntOrFloatBitWidth();
304 auto extract = ExtractOp::create(b, in, 0, outWidth);
307 wireOut(extract, op.instanceName(), op.portName(op.getOut()), b);
308 wires.append({in.getInput(), out});
310 .Case([&](NotLibOp op) {
312 wireIn(op.getIn(), op.instanceName(), op.portName(op.getIn()), b);
317 wireOut(notOp, op.instanceName(), op.portName(op.getOut()), b);
318 wires.append({in.getInput(), out});
320 .Case([&](WireLibOp op) {
321 auto wire =
wireIn(op.getIn(), op.instanceName(),
"", b);
322 wires.append({wire.getInput(), wire});
324 .Case([&](UndefLibOp op) {
325 auto undef = sv::ConstantXOp::create(b, op.getType());
326 wires.append({undef});
328 .Case([&](PadLibOp op) {
330 wireIn(op.getIn(), op.instanceName(), op.portName(op.getIn()), b);
331 auto srcWidth = in.getType().getIntOrFloatBitWidth();
332 auto destWidth = op.getOut().getType().getIntOrFloatBitWidth();
334 APInt(destWidth - srcWidth, 0));
336 op.instanceName(), op.portName(op.getOut()), b);
337 wires.append({in.getInput(), padded});
339 .Case([&](ExtSILibOp op) {
341 wireIn(op.getIn(), op.instanceName(), op.portName(op.getIn()), b);
343 op.instanceName(), op.portName(op.getOut()), b);
344 wires.append({in.getInput(), extsi});
346 .Default([](Operation *) {
return SmallVector<Value>(); });
380 ImplicitLocOpBuilder &b)
const {
382 wireIn(op.getClk(), op.instanceName(), op.portName(op.getClk()), b);
384 wireIn(op.getReset(), op.instanceName(), op.portName(op.getReset()), b);
385 auto go =
wireIn(op.getGo(), op.instanceName(), op.portName(op.getGo()), b);
387 wireIn(op.getLeft(), op.instanceName(), op.portName(op.getLeft()), b);
389 wireIn(op.getRight(), op.instanceName(), op.portName(op.getRight()), b);
390 wires.append({clk.getInput(), reset.getInput(), go.getInput(),
391 left.getInput(), right.getInput()});
394 auto seqClk = seq::ToClockOp::create(b, clk);
395 auto doneReg =
reg(go, seqClk, reset,
396 op.instanceName() +
"_" + op.portName(op.getDone()), b);
398 wireOut(doneReg, op.instanceName(), op.portName(op.getDone()), b);
400 auto targetOp = TargetOpTy::create(b, left, right,
false);
401 for (
auto &&[targetRes, sourceRes] :
402 llvm::zip(targetOp->getResults(), op.getOutputPorts())) {
403 auto portName = op.portName(sourceRes);
405 auto resReg =
regCe(targetRes, seqClk, clockEn, reset,
407 wires.push_back(
wireOut(resReg, op.instanceName(), portName, b));
410 wires.push_back(done);