CIRCT  18.0.0git
DropName.cpp
Go to the documentation of this file.
1 //===- DropName.cpp - Drop Names -----------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the DropName pass.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "PassDetails.h"
17 
18 using namespace circt;
19 using namespace firrtl;
20 
21 namespace {
22 struct DropNamesPass : public DropNameBase<DropNamesPass> {
24  this->preserveMode = preserveMode;
25  }
26 
27  enum ModAction { Drop, Keep, Demote };
28 
29  void runOnOperation() override {
30  size_t namesDropped = 0;
31  size_t namesChanged = 0;
33  // Drop all names.
34  dropNamesIf(namesChanged, namesDropped, [](FNamableOp op) {
35  if (isUselessName(op.getName()))
36  return ModAction::Drop;
37  return ModAction::Demote;
38  });
39  } else if (preserveMode == PreserveValues::Strip) {
40  // Strip all names.
41  dropNamesIf(namesChanged, namesDropped,
42  [](FNamableOp op) { return ModAction::Drop; });
43  } else if (preserveMode == PreserveValues::Named) {
44  // Drop the name if it isn't considered meaningful.
45  dropNamesIf(namesChanged, namesDropped, [](FNamableOp op) {
46  if (isUselessName(op.getName()))
47  return ModAction::Drop;
48  if (op.getName().starts_with("_"))
49  return ModAction::Demote;
50  return ModAction::Keep;
51  });
52  } else if (preserveMode == PreserveValues::All) {
53  // Drop the name if it isn't considered meaningful.
54  dropNamesIf(namesChanged, namesDropped, [](FNamableOp op) {
55  if (isUselessName(op.getName()))
56  return ModAction::Demote;
57  return ModAction::Keep;
58  });
59  }
60  numNamesConverted += namesChanged;
61  numNamesDropped += namesDropped;
62  }
63 
64 private:
65  size_t dropNamesIf(size_t &namesChanged, size_t &namesDropped,
66  llvm::function_ref<ModAction(FNamableOp)> pred) {
67  size_t changedNames = 0;
68  auto droppableNameAttr =
69  NameKindEnumAttr::get(&getContext(), NameKindEnum::DroppableName);
70  getOperation()->walk([&](FNamableOp op) {
71  switch (pred(op)) {
72  case ModAction::Drop:
73  op.dropName();
74  ++namesDropped;
75  break;
76  case ModAction::Demote:
77  op.setNameKindAttr(droppableNameAttr);
78  ++namesChanged;
79  break;
80  default:
81  break;
82  }
83  });
84  return changedNames;
85  }
86 };
87 
88 } // end anonymous namespace
89 
90 std::unique_ptr<mlir::Pass>
92  return std::make_unique<DropNamesPass>(mode);
93 }
lowerAnnotationsNoRefTypePorts preserveMode
Definition: Firtool.cpp:94
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
Definition: CalyxOps.cpp:53
@ None
Don't explicitly preserve any named values.
Definition: Passes.h:154
@ Strip
Strip all names. No name on declaration is preserved.
Definition: Passes.h:150
std::unique_ptr< mlir::Pass > createDropNamesPass(PreserveValues::PreserveMode mode=PreserveValues::None)
Definition: DropName.cpp:91
bool isUselessName(circt::StringRef name)
Return true if this is a useless temporary name produced by FIRRTL.
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
Definition: DebugAnalysis.h:21