isomatch
gateExpression.h
Go to the documentation of this file.
1 
5 #pragma once
6 
7 #include "signatureConstants.h"
8 #include <string>
9 
10 namespace expr {
11 
22  };
23 
24  /***********************************************************************/
25  /* WARNING! The following enums are duplicated (on purpose) inside the */
26  /* C API. Change this API as well if you are to change these enums! */
27  /***********************************************************************/
28 
31  BAnd,
32  BOr,
33  BXor,
34  BAdd,
35  BSub,
36  BMul,
37  BDiv,
38  BMod,
39  BLsr,
40  BLsl,
41  BAsr,
42  };
43 
46  UNot,
47  };
48 
54  };
55 
56 };
57 
58 class BadHex : public std::exception {};
59 
63  : type(type), refcount(0) {}
64  virtual ~ExpressionBase() {}
66 
68  virtual sign_t sign() const = 0; // FIXME memoize?
69 
71  bool equals(const ExpressionBase& oth) const;
72 
74  inline void addRef() {
75  refcount++;
76  }
77 
79  void deleteSelf() {
80  refcount--;
81  if(refcount == 0)
82  delete this;
83  }
84 
85  private:
86  virtual bool innerEqual(const ExpressionBase& oth) const = 0;
87 
88  protected:
89  int refcount;
90 };
91 
94  ExpressionConst(unsigned val)
95  : ExpressionBase(expr::ExprConst), val(val) {}
96 
97  unsigned val;
98 
99  virtual sign_t sign() const;
100 
101  private:
102  virtual bool innerEqual(const ExpressionBase& oth) const;
103 };
104 
107  ExpressionLongConst(const std::string& val)
108  : ExpressionBase(expr::ExprConst), val(val)
109  {
110  for(const auto& ch: this->val) {
111  if(!('0' <= ch && ch <= '9')
112  && !('a' <= ch && ch <= 'f')
113  && !('A' <= ch && ch <= 'F'))
114  throw BadHex();
115  }
116  }
117 
118  std::string val;
119 
120  virtual sign_t sign() const;
121 
122  private:
123  virtual bool innerEqual(const ExpressionBase& oth) const;
124 };
125 
128  ExpressionVar(int id) : ExpressionBase(expr::ExprVar), id(id) {}
129 
130  int id;
131 
132  virtual sign_t sign() const;
133 
134  private:
135  virtual bool innerEqual(const ExpressionBase& oth) const;
136 };
137 
141  ExpressionBase* right,
143  ExpressionBase(expr::ExprBinOp), left(left), right(right), op(op)
144  {
145  left->addRef();
146  right->addRef();
147  }
148  virtual ~ExpressionBinOp() {
149  left->deleteSelf();
150  right->deleteSelf();;
151  }
152 
155 
156  virtual sign_t sign() const;
157 
158  private:
159  virtual bool innerEqual(const ExpressionBase& oth) const;
160 };
161 
165  ExpressionBase(expr::ExprUnOp), expr(expr), op(op)
166  {
167  expr->addRef();
168  }
169  virtual ~ExpressionUnOp() {
170  expr->deleteSelf();
171  }
172 
175 
176  virtual sign_t sign() const;
177 
178  private:
179  virtual bool innerEqual(const ExpressionBase& oth) const;
180 };
181 
185  int val,
187  ExpressionBase(expr::ExprUnOpCst), expr(expr), val(val), op(op)
188  {
189  expr->addRef();
190  }
191  virtual ~ExpressionUnOpCst() {
192  expr->deleteSelf();
193  }
194 
196  int val;
198 
199  virtual sign_t sign() const;
200 
201  private:
202  virtual bool innerEqual(const ExpressionBase& oth) const;
203 };
204 
207  ExpressionSlice(ExpressionBase* expr, unsigned beg, unsigned end) :
208  ExpressionBase(expr::ExprSlice), expr(expr), beg(beg), end(end)
209  {
210  expr->addRef();
211  }
212  virtual ~ExpressionSlice() {
213  expr->deleteSelf();
214  }
215 
217  unsigned beg;
218  unsigned end;
219 
220  virtual sign_t sign() const;
221 
222  private:
223  virtual bool innerEqual(const ExpressionBase& oth) const;
224 };
225 
229  ExpressionBase(expr::ExprMerge), left(left), right(right)
230  {
231  left->addRef();
232  right->addRef();
233  }
234  virtual ~ExpressionMerge() {
235  left->deleteSelf();
236  right->deleteSelf();
237  };
238 
239  ExpressionBase *left, *right;
240 
241  virtual sign_t sign() const;
242 
243  private:
244  virtual bool innerEqual(const ExpressionBase& oth) const;
245 };
Definition: gateExpression.h:139
Definition: gateExpression.h:163
virtual ~ExpressionUnOp()
Definition: gateExpression.h:169
Binary operator (+, AND, ...)
Definition: gateExpression.h:17
Bitwise and.
Definition: gateExpression.h:31
Logical shift left of fixed shift.
Definition: gateExpression.h:52
unsigned end
Last index (exclusive) of the subword.
Definition: gateExpression.h:218
ExpressionBinOp(ExpressionBase *left, ExpressionBase *right, expr::ExpressionBinOperator op)
Definition: gateExpression.h:140
Logical shift right of fixed shift.
Definition: gateExpression.h:51
Modulus.
Definition: gateExpression.h:38
Definition: gateExpression.h:227
ExpressionBase(const expr::ExpressionType &type)
Definition: gateExpression.h:62
Logical shift right.
Definition: gateExpression.h:39
ExpressionBase * expr
Definition: gateExpression.h:216
ExpressionUnOperatorCst
Definition: gateExpression.h:50
ExpressionConst(unsigned val)
Definition: gateExpression.h:94
ExpressionBinOperator
Definition: gateExpression.h:30
Arithmetic shift right of fixed shift.
Definition: gateExpression.h:53
Division.
Definition: gateExpression.h:37
virtual ~ExpressionBase()
Definition: gateExpression.h:64
ExpressionType
Definition: gateExpression.h:13
unsigned val
Numeric value.
Definition: gateExpression.h:97
ExpressionBase * right
Definition: gateExpression.h:153
Arithmetic shift right.
Definition: gateExpression.h:41
Definition: gateExpression.h:106
void addRef()
The object is referenced somewhere.
Definition: gateExpression.h:74
End variable.
Definition: gateExpression.h:14
expr::ExpressionType type
Type of the expression (used for casts)
Definition: gateExpression.h:65
Definition: gateExpression.h:93
expr::ExpressionBinOperator op
Operator.
Definition: gateExpression.h:154
Subtraction.
Definition: gateExpression.h:35
ExpressionBase * expr
Sub-expression.
Definition: gateExpression.h:173
virtual ~ExpressionBinOp()
Definition: gateExpression.h:148
ExpressionVar(int id)
Definition: gateExpression.h:128
expr::ExpressionUnOperatorCst op
Operator.
Definition: gateExpression.h:197
unsigned beg
First index (inclusive) of the subword.
Definition: gateExpression.h:217
int refcount
Definition: gateExpression.h:89
ExpressionLongConst(const std::string &val)
Definition: gateExpression.h:107
Definition: gateExpression.h:183
Addition.
Definition: gateExpression.h:34
void deleteSelf()
Call this instead of delete
Definition: gateExpression.h:79
ExpressionBase * right
Definition: gateExpression.h:237
virtual ~ExpressionMerge()
Definition: gateExpression.h:234
Logical shift left.
Definition: gateExpression.h:40
ExpressionUnOp(ExpressionBase *expr, expr::ExpressionUnOperator op)
Definition: gateExpression.h:164
ExpressionMerge(ExpressionBase *left, ExpressionBase *right)
Definition: gateExpression.h:228
Definition: gateExpression.h:10
Unary operator (NOT, ...)
Definition: gateExpression.h:18
Definition: gateExpression.h:61
Unary operator with constant (CstLSL, ...)
Definition: gateExpression.h:19
Definition: gateExpression.h:127
int val
Constant associated.
Definition: gateExpression.h:196
Concatenate two words into a longer one.
Definition: gateExpression.h:21
Bitwise or.
Definition: gateExpression.h:32
std::string val
Numeric value.
Definition: gateExpression.h:118
int id
Id of the input pin referred.
Definition: gateExpression.h:130
sign_t sign(circuit_handle circuit)
Definition: isomatch.cpp:516
Integer constant.
Definition: gateExpression.h:15
ExpressionUnOperator
Definition: gateExpression.h:45
ExpressionBase * expr
Definition: gateExpression.h:195
virtual ~ExpressionUnOpCst()
Definition: gateExpression.h:191
Definition: gateExpression.h:58
expr::ExpressionUnOperator op
Operator.
Definition: gateExpression.h:174
Bitwise exclusive or.
Definition: gateExpression.h:33
Unary bitwise not.
Definition: gateExpression.h:46
Long integer constant.
Definition: gateExpression.h:16
Multiplication.
Definition: gateExpression.h:36
Definition: gateExpression.h:206
Take a subword out of a word.
Definition: gateExpression.h:20
ExpressionUnOpCst(ExpressionBase *expr, int val, expr::ExpressionUnOperatorCst op)
Definition: gateExpression.h:184
uint64_t sign_t
Type of a circuit signature.
Definition: isomatch.h:26
ExpressionSlice(ExpressionBase *expr, unsigned beg, unsigned end)
Definition: gateExpression.h:207
virtual ~ExpressionSlice()
Definition: gateExpression.h:212