HAL  v4.5.0-254-g8f9f6a423
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
bool_wizardpage.cpp
Go to the documentation of this file.
4 
5 namespace hal
6 {
7  const char* BooleanFunctionEdit::STATE_EMPTY = "Empty";
8  const char* BooleanFunctionEdit::STATE_VALID = "Valid";
9  const char* BooleanFunctionEdit::STATE_INVALID = "Invalid";
10 
11  BooleanFunctionEdit::BooleanFunctionEdit(std::set<std::string> &legalVar, QWidget *parent)
12  : QLineEdit(parent), mState(STATE_VALID), mLegalVariables(legalVar)
13  {
14  connect(this, &QLineEdit::textChanged, this, &BooleanFunctionEdit::handleEditingFinished);
15  connect(this, &BooleanFunctionEdit::legalVariablesChanged, this, &BooleanFunctionEdit::handleEditingFinished);
16 
17  setState(STATE_EMPTY); // do an active transition to enforce style
18  }
19 
21  {
22  if (s == mState) return;
23  mState = s;
25  QStyle* sty = style();
26 
27  sty->unpolish(this);
28  sty->polish(this);
29  }
30 
31  void BooleanFunctionEdit::setLegalVariables(std::set<std::string> &legalVar)
32  {
33  mLegalVariables = legalVar;
34  Q_EMIT legalVariablesChanged(legalVar);
35  }
36 
37  void BooleanFunctionEdit::handleEditingFinished()
38  {
39  if (text().isEmpty())
40  {
41  setState(STATE_EMPTY);
42  return;
43  }
44 
45  QString nextState = STATE_VALID; // think positive
46 
47  auto bfres = BooleanFunction::from_string(text().toStdString());
48  if(bfres.is_error())
49  nextState = STATE_INVALID;
50  else
51  {
52  BooleanFunction bf = bfres.get();
53  std::set<std::string> var_names = bf.get_variable_names();
54  std::set<std::string> leg = mLegalVariables;
55  for(std::string vname : var_names)
56  {
57  if (mLegalVariables.find(vname) == mLegalVariables.end())
58  {
59  nextState = STATE_INVALID;
60  break;
61  }
62  }
63  }
64  if (mState != nextState)
65  setState(nextState);
66 
67  }
68 //--------------------------------------------
70  : QWizardPage(parent)
71  {
72  setTitle("Boolean functions");
73  setSubTitle("Enter the boolean functions");
74  mLayout = new QGridLayout(this);
75  }
76 
78  mWizard = static_cast<GateLibraryWizard*>(wizard());
79 
80  std::set<std::string> legVars;
81  for (PinItem* pi : mWizard->mPinModel->getInputPins())
82  legVars.insert(pi->getName().toStdString());
83 
84  for (PinItem* pi : mWizard->mPinModel->getInternalPins())
85  legVars.insert(pi->getName().toStdString());
86 
87  if(mWizard->generalInfoPage->getProperties().contains(GateTypeProperty::ff)
88  || mWizard->generalInfoPage->getProperties().contains(GateTypeProperty::latch))
89  {
90  legVars.insert(mWizard->statePage->mStateIdentifier->text().toStdString());
91  legVars.insert(mWizard->statePage->mNegStateIdentifier->text().toStdString());
92  }
93 
94  if (!mEditFunctions.isEmpty())
95  {
96  for (BooleanFunctionEdit* bfe : mEditFunctions)
97  delete bfe;
98  mEditFunctions.clear();
99  }
100 
101  std::unordered_map<std::string, BooleanFunction> boolFunctions;
102  if(mGate != nullptr)
103  boolFunctions = mGate->get_boolean_functions();
104 
105  int boolFuncCnt = 0;
106  for(PinItem* pin : mWizard->mPinModel->getOutputPins())
107  {
108  if(mWizard->isDefinedByLut(pin))
109  {
110  //the LUT defines this pin already, so it may be used as input of the remaining functions
111  legVars.insert(pin->getName().toStdString());
112  continue;
113  }
114 
115  QLabel* label = new QLabel(pin->getName(), this);
116  BooleanFunctionEdit* lineEdit = new BooleanFunctionEdit(legVars, this);
117  mLayout->addWidget(label, boolFuncCnt, 0);
118  mLayout->addWidget(lineEdit, boolFuncCnt, 1);
119 
120  if(auto bf = boolFunctions.find(pin->getName().toStdString()); bf != boolFunctions.end())
121  {
122  lineEdit->setText(QString::fromStdString(bf->second.to_string()));
123  }
124  connect(lineEdit, &BooleanFunctionEdit::stateChanged,this,&BoolWizardPage::handleStateChanged);
125  connect(lineEdit, &BooleanFunctionEdit::textChanged, this, &BoolWizardPage::handleTextChanged);
126  mEditFunctions.append(lineEdit);
127  mOutputPins.append(pin->getName());
128 
129  //an output pin whose function is defined above may be used as input of the functions below it
130  legVars.insert(pin->getName().toStdString());
131  boolFuncCnt++;
132  }
133 
134  setLayout(mLayout);
136  mWizard->mEditMode = true;
137  }
138 
140  {
141  mGate = gate;
142  }
143 
144  void BoolWizardPage::handleStateChanged(const QString& stat)
145  {
146  Q_UNUSED(stat);
148  if(mWizard->mEditMode) Q_EMIT hasChanged();
149  }
150 
151  void BoolWizardPage::handleTextChanged(const QString& txt)
152  {
153  Q_UNUSED(txt);
154 
155  //explicitly needed here because isComplete() is called
156  //before mWasEdited is changed in the wizard
157  //
158 
159  if(mWizard->mEditMode)
160  {
161  mWizard->mWasEdited = true;
162  Q_EMIT hasChanged();
163  }
165  }
166 
168  {
169  for(BooleanFunctionEdit* lineEdit : mEditFunctions)
170  {
171  if(!lineEdit->isValid())
172  {
173  return false;
174  }
175  }
176  if(isFinalPage() && !mWizard->mWasEdited) return false;
177  mWizard->mEditMode = false;
178  return true;
179  }
180 
181  std::unordered_map<std::string, BooleanFunction> BoolWizardPage::getBoolFunctions(){
182  std::unordered_map<std::string, BooleanFunction> retval;
183  for(int i = 0; i<mEditFunctions.length(); i++)
184  {
185  auto bfres = BooleanFunction::from_string(mEditFunctions[i]->text().toStdString());
186  if(bfres.is_error())
187  continue;
188  else
189  retval.insert({mOutputPins[i].toStdString(), bfres.get()});
190  }
191  return retval;
192  }
193 
194 }
BoolWizardPage(QWidget *parent=nullptr)
std::unordered_map< std::string, BooleanFunction > getBoolFunctions()
void setData(GateType *gate)
void initializePage() override
bool isComplete() const override
void setState(const QString &s)
void setLegalVariables(std::set< std::string > &legalVar)
void legalVariablesChanged(std::set< std::string > legalVar)
BooleanFunctionEdit(std::set< std::string > &legalVar, QWidget *parent=nullptr)
void stateChanged(QString s)
static Result< BooleanFunction > from_string(const std::string &expression)
bool isDefinedByLut(const PinItem *pin) const
const std::unordered_map< std::string, BooleanFunction > & get_boolean_functions() const
Definition: gate_type.cpp:746
QList< GateTypeProperty > getProperties() const
An item in the PinModel.
Definition: pin_item.h:48
QList< PinItem * > getInputPins()
Definition: pin_model.cpp:733
QList< PinItem * > getOutputPins()
Definition: pin_model.cpp:748
QList< PinItem * > getInternalPins()
Definition: pin_model.cpp:763
Definition: defines.h:45
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment)
void textChanged(const QString &text)
void append(const T &value)
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString fromStdString(const std::string &str)
virtual void polish(QWidget *widget)
virtual void unpolish(QWidget *widget)
void setLayout(QLayout *layout)
QStyle * style() const const
void completeChanged()
bool isFinalPage() const const
void setSubTitle(const QString &subTitle)
void setTitle(const QString &title)
QWizard * wizard() const const