CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
imath_Verilog.cc
Go to the documentation of this file.
2 
3 using namespace trklet;
4 
5 void VarInv::writeLUT(std::ofstream& fs, Verilog) const {
6  for (int i = 0; i < Nelements_; ++i)
7  fs << std::hex << (LUT[i] & ((1 << nbits_) - 1)) << std::dec << "\n";
8 }
9 
10 void VarBase::print_truncation(std::string& t, const std::string& o1, const int ps, Verilog) const {
11  if (ps > 0) {
12  t += "wire signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
13  t += "reg signed [" + itos(nbits_ + ps - 1) + ":0]" + name_ + "_tmp;\n";
14  t += "always @(posedge clk) " + name_ + "_tmp <= " + o1 + ";\n";
15  t += "assign " + name_ + " = " + name_ + "_tmp[" + itos(nbits_ + ps - 1) + ":" + itos(ps) + "];\n";
16  } else {
17  t += "reg signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
18  t += "always @(posedge clk) " + name_ + " <= " + o1 + ";\n";
19  }
20 }
21 
22 //
23 // print functions
24 //
25 
26 void VarCut::print(std::map<const VarBase*, std::set<std::string> >& cut_strings,
27  const int step,
28  Verilog,
29  const std::map<const VarBase*, std::set<std::string> >* const previous_cut_strings) const {
30  int l = step - cut_var_->latency() - cut_var_->step();
32  if (l > 0)
33  name += "_delay" + itos(l);
34 
35  const int lower_cut = lower_cut_ / cut_var_->K();
36  const int upper_cut = upper_cut_ / cut_var_->K();
37  if (!previous_cut_strings || (previous_cut_strings && !previous_cut_strings->count(cut_var_))) {
38  if (!cut_strings.count(cut_var_))
39  cut_strings[cut_var_];
40  cut_strings.at(cut_var_).insert(name + " > " + itos(lower_cut) + " && " + name + " < " + itos(upper_cut));
41  }
42 }
43 
44 void VarBase::print_cuts(std::map<const VarBase*, std::set<std::string> >& cut_strings,
45  const int step,
46  Verilog,
47  const std::map<const VarBase*, std::set<std::string> >* const previous_cut_strings) const {
48  if (p1_)
49  p1_->print_cuts(cut_strings, step, verilog, previous_cut_strings);
50  if (p2_)
51  p2_->print_cuts(cut_strings, step, verilog, previous_cut_strings);
52  if (p3_)
53  p3_->print_cuts(cut_strings, step, verilog, previous_cut_strings);
54 
55  int l = step - latency_ - step_;
57  if (l > 0)
58  name += "_delay" + itos(l);
59 
60  for (const auto& cut : cuts_) {
61  const VarCut* const cast_cut = (VarCut*)cut;
62  const int lower_cut = cast_cut->lower_cut() / K_;
63  const int upper_cut = cast_cut->upper_cut() / K_;
64  if (!previous_cut_strings || (previous_cut_strings && !previous_cut_strings->count(this))) {
65  if (!cut_strings.count(this))
66  cut_strings[this];
67  cut_strings.at(this).insert(name + " > " + itos(lower_cut) + " && " + name + " < " + itos(upper_cut));
68  }
69  }
70 }
71 
72 void VarAdjustK::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
73  assert(p1_);
74  assert(l2 == 0);
75  assert(l3 == 0);
76 
77  std::string shift = "";
78  if (lr_ > 0)
79  shift = " >>> " + itos(lr_);
80  else if (lr_ < 0)
81  shift = " << " + itos(-lr_);
82 
83  std::string n1 = p1_->name();
84  if (l1 > 0)
85  n1 = n1 + "_delay" + itos(l1);
86 
87  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n";
88  std::string t = "wire signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
89  t += "assign " + name_ + " = " + n1 + shift;
90  fs << t << "; \n";
91 }
92 
93 void VarAdjustKR::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
94  assert(p1_);
95  assert(l2 == 0);
96  assert(l3 == 0);
97 
98  std::string n1 = p1_->name();
99  if (l1 > 0)
100  n1 = n1 + "_delay" + itos(l1);
101 
102  std::string o1 = n1;
103  if (lr_ == 1)
104  o1 = "(" + o1 + "+1)>>>1";
105  if (lr_ > 1)
106  o1 = "( (" + o1 + ">>>" + itos(lr_ - 1) + ")+1)>>>1";
107  if (lr_ < 0)
108  o1 = o1 + "<<" + itos(-lr_);
109 
110  std::string t = "reg signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
111  t += "always @(posedge clk) " + name_ + " <= " + o1;
112  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t << ";\n";
113 }
114 
115 void VarDef::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
116  assert(l1 == 0);
117  assert(l2 == 0);
118  assert(l3 == 0);
119 
120  std::string t = "reg signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
121  t = t + "always @(posedge clk) " + name_ + " <= " + name_ + "_wire;\n";
122  fs << "// units " << kstring() << "\t" << K_ << "\n" << t;
123 }
124 
125 void VarParam::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
126  assert(l1 == 0);
127  assert(l2 == 0);
128  assert(l3 == 0);
129  std::string t = "parameter " + name_ + " = ";
130  if (ival_ < 0)
131  t = t + "- " + itos(nbits_) + "\'sd" + itos(-ival_);
132  else
133  t = t + itos(nbits_) + "\'sd" + itos(ival_);
134  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t << ";\n";
135 }
136 
137 void VarAdd::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
138  assert(p1_);
139  assert(p2_);
140  assert(l3 == 0);
141  std::string o1 = p1_->name();
142  if (l1 > 0)
143  o1 += "_delay" + itos(l1);
144  if (shift1 > 0) {
145  o1 += "<<" + itos(shift1);
146  o1 = "(" + o1 + ")";
147  }
148 
149  std::string o2 = p2_->name();
150  if (l2 > 0)
151  o2 += "_delay" + itos(l2);
152  if (shift2 > 0) {
153  o2 += "<<" + itos(shift2);
154  o2 = "(" + o2 + ")";
155  }
156 
157  o1 = o1 + " + " + o2;
158 
159  std::string t = "";
160  print_truncation(t, o1, ps_, verilog);
161  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t;
162 }
163 
164 void VarSubtract::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
165  assert(p1_);
166  assert(p2_);
167  assert(l3 == 0);
168  std::string o1 = p1_->name();
169  if (l1 > 0)
170  o1 += "_delay" + itos(l1);
171  if (shift1 > 0) {
172  o1 += "<<" + itos(shift1);
173  o1 = "(" + o1 + ")";
174  }
175 
176  std::string o2 = p2_->name();
177  if (l2 > 0)
178  o2 += "_delay" + itos(l2);
179  if (shift2 > 0) {
180  o2 += "<<" + itos(shift2);
181  o2 = "(" + o2 + ")";
182  }
183 
184  o1 = o1 + " - " + o2;
185 
186  std::string t = "";
187  print_truncation(t, o1, ps_, verilog);
188  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t;
189 }
190 
191 void VarNounits::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
192  assert(p1_);
193  assert(l2 == 0);
194  assert(l3 == 0);
195  std::string n1 = p1_->name();
196  if (l1 > 0)
197  n1 = n1 + "_delay" + itos(l1);
198  std::string o1 = "(" + n1 + " * " + itos(cI_) + ")";
199 
200  std::string t = "";
201  print_truncation(t, o1, ps_, verilog);
202  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t;
203 }
204 
205 void VarTimesC::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
206  assert(p1_);
207  assert(l2 == 0);
208  assert(l3 == 0);
209  std::string n1 = p1_->name();
210  if (l1 > 0)
211  n1 = n1 + "_delay" + itos(l1);
212  std::string o1 = "(" + n1 + " * " + itos(cI_) + ")";
213 
214  std::string t = "";
215  print_truncation(t, o1, ps_, verilog);
216  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t;
217 }
218 
219 void VarNeg::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
220  assert(p1_);
221  assert(l2 == 0);
222  assert(l3 == 0);
223  std::string n1 = p1_->name();
224  if (l1 > 0)
225  n1 = n1 + "_delay" + itos(l1);
226 
227  std::string t = "reg signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
228  t += "always @(posedge clk) " + name_ + " <= - " + n1;
229  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t << ";\n";
230 }
231 
232 void VarShiftround::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
233  assert(p1_);
234  assert(l2 == 0);
235  assert(l3 == 0);
236  std::string n1 = p1_->name();
237  if (l1 > 0)
238  n1 = n1 + "_delay" + itos(l1);
239  std::string o1 = n1;
240  if (shift_ == 1)
241  o1 = "(" + o1 + "+1)>>>1";
242  if (shift_ > 1)
243  o1 = "( (" + o1 + ">>>" + itos(shift_ - 1) + ")+1)>>>1";
244  if (shift_ < 0)
245  o1 = o1 + "<<" + itos(-shift_);
246 
247  std::string t = "reg signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
248  t += "always @(posedge clk) " + name_ + " <= " + o1;
249  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t << ";\n";
250 }
251 
252 void VarShift::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
253  assert(p1_);
254  assert(l2 == 0);
255  assert(l3 == 0);
256  std::string n1 = p1_->name();
257  if (l1 > 0)
258  n1 = n1 + "_delay" + itos(l1);
259  std::string o1 = n1;
260  if (shift_ > 0)
261  o1 = o1 + ">>>" + itos(shift_);
262  if (shift_ < 0)
263  o1 = o1 + "<<" + itos(-shift_);
264 
265  std::string t = "wire signed [" + itos(nbits_ - 1) + ":0]" + name_ + ";\n";
266  t += "assign " + name_ + " = " + o1;
267  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t << ";\n";
268 }
269 
270 void VarMult::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
271  assert(l3 == 0);
272  assert(p1_);
273  std::string n1 = p1_->name();
274  if (l1 > 0)
275  n1 = n1 + "_delay" + itos(l1);
276  assert(p2_);
277  std::string n2 = p2_->name();
278  if (l2 > 0)
279  n2 = n2 + "_delay" + itos(l2);
280  std::string o1 = n1 + " * " + n2;
281 
282  std::string t = "";
283  print_truncation(t, o1, ps_, verilog);
284  fs << "// " << nbits_ << " bits \t " << kstring() << "\t" << K_ << "\n" << t;
285 }
286 
287 void VarInv::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
288  assert(p1_);
289  assert(l2 == 0);
290  assert(l3 == 0);
291  std::string n1 = p1_->name();
292  if (l1 > 0)
293  n1 = n1 + "_delay" + itos(l1);
294  //first calculate address
295  std::string t1 = "addr_" + name_;
296  std::string t = "wire [" + itos(nbaddr_ - 1) + ":0] " + t1 + ";\n";
297  t = t + "assign " + t1 + " = ";
298  if (shift_ > 0)
299  t = t + "(" + n1 + ">>>" + itos(shift_) + ") & " + itos(mask_);
300  else
301  t = t + n1 + " & " + itos(mask_);
302  fs << t << "; // address for the LUT\n";
303 
304  t = "wire signed [" + itos(nbits_ - 1) + ":0] " + name_ + ";\n";
305  fs << t;
306 
307  std::string t2 = "LUT_" + name_;
308 
309  fs << "Memory #( \n";
310  fs << " .RAM_WIDTH(" << nbits_ << "), // Specify RAM data width \n";
311  fs << " .RAM_DEPTH(" << Nelements_ << "), // Specify RAM depth (number of entries) \n";
312  fs << " .RAM_PERFORMANCE(\"HIGH_PERFORMANCE\"), // \"HIGH_PERFORMANCE\" = 2 clks latency \n";
313  fs << " .INIT_FILE() \n";
314  fs << " ) " << t2 << " ( \n";
315  fs << " .addra(" << itos(nbaddr_) << "\'b0), // Write address bus, width determined from RAM_DEPTH \n";
316  fs << " .addrb(" << t1 << " ), // Read address bus, width determined from RAM_DEPTH \n";
317  fs << " .dina(" << itos(nbits_) << "\'b0), // RAM input data, width determined from RAM_WIDTH \n";
318  fs << " .clka(clk), // Write clock \n";
319  fs << " .clkb(clk), // Read clock \n";
320  fs << " .wea(1\'b0), // Write enable \n";
321  fs << " .enb(1\'b1), // Read Enable, for additional power savings, disable when not in use \n";
322  fs << " .rstb(reset), // Output reset (does not affect memory contents) \n";
323  fs << " .regceb(1\'b1), // Output register enable \n";
324  fs << " .doutb(" << name_ << ") // RAM output data, \n";
325  fs << " ); \n";
326 }
327 
328 void VarDSPPostadd::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
329  assert(p1_);
330  assert(p2_);
331  assert(p3_);
332  std::string n1 = p1_->name();
333  if (l1 > 0)
334  n1 = n1 + "_delay" + itos(l1);
335  std::string n2 = p2_->name();
336  if (l2 > 0)
337  n2 = n2 + "_delay" + itos(l2);
338  std::string n3 = p3_->name();
339  if (l3 > 0)
340  n3 = n3 + "_delay" + itos(l3);
341 
342  if (shift3_ > 0)
343  n3 = n3 + "<<" + itos(shift3_);
344  if (shift3_ < 0)
345  n3 = n3 + ">>>" + itos(-shift3_);
346 
347  std::string n4 = "";
348  if (ps_ > 0)
349  n4 = ">>>" + itos(ps_);
350 
351  fs << name_ + " = DSP_postadd(" + n1 + ", " + n2 + ", " + n3 + ")" + n4 + ";";
352 }
353 
354 void VarFlag::print(std::ofstream& fs, Verilog, int l1, int l2, int l3) {
355  assert(l1 == 0);
356  assert(l2 == 0);
357  assert(l3 == 0);
358 
359  fs << "wire " << name_ << ";" << std::endl;
360  fs << "assign " << name_ << " = (";
361  std::map<const VarBase*, std::set<std::string> > cut_strings0, cut_strings1;
362  for (const auto& cut : cuts_) {
363  if (cut->op() != "cut")
364  continue;
365  const VarCut* const cast_cut = (VarCut*)cut;
366  cast_cut->print(cut_strings0, step_, verilog);
367  }
368  for (const auto& cut : cuts_) {
369  if (cut->op() != "cut")
370  cut->print_cuts(cut_strings1, step_, verilog, &cut_strings0);
371  else {
372  if (cut->cut_var()->p1())
373  cut->cut_var()->p1()->print_cuts(cut_strings1, step_, verilog, &cut_strings1);
374  if (cut->cut_var()->p2())
375  cut->cut_var()->p2()->print_cuts(cut_strings1, step_, verilog, &cut_strings1);
376  if (cut->cut_var()->p3())
377  cut->cut_var()->p3()->print_cuts(cut_strings1, step_, verilog, &cut_strings1);
378  }
379  }
380 
381  std::string separator = "";
382  for (const auto& cut_var : cut_strings0) {
383  separator += "((";
384  for (const auto& cut_string : cut_var.second) {
385  fs << separator << cut_string;
386  separator = ") || (";
387  }
388  separator = ")) && ";
389  }
390  for (const auto& cut_var : cut_strings1) {
391  separator += "((";
392  for (const auto& cut_string : cut_var.second) {
393  fs << separator << cut_string;
394  separator = ") || (";
395  }
396  separator = ")) && ";
397  }
398 
399  fs << ")));";
400 }
401 
402 void VarBase::print_step(int step, std::ofstream& fs, Verilog) {
403  if (!readytoprint_)
404  return;
405  if (step > step_)
406  return;
407  int l1 = 0;
408  int l2 = 0;
409  int l3 = 0;
410  if (p1_) {
411  p1_->print_step(step, fs, verilog);
412  l1 = step_ - p1_->latency() - p1_->step();
413  }
414  if (p2_) {
415  p2_->print_step(step, fs, verilog);
416  l2 = step_ - p2_->latency() - p2_->step();
417  }
418  if (p3_) {
419  p3_->print_step(step, fs, verilog);
420  l3 = step_ - p3_->latency() - p3_->step();
421  }
422  if (step == step_) {
423  if (l1 < 0 || l2 < 0 || l3 < 0 || (l1 > 0 && l2 > 0 && l3 > 0)) {
424  char slog[100];
425  sprintf(slog, "%s::print_step(%i): something wrong with latencies! %i %i %i\n", name_.c_str(), step, l1, l2, l3);
426  edm::LogVerbatim("Tracklet") << slog;
427  dump_msg();
428  assert(0);
429  }
430  if (l1 > 0) {
431  if (p1_->op() != "const")
432  fs << pipe_delay(p1_, p1_->nbits(), l1);
433  else
434  l1 = 0;
435  }
436  if (l2 > 0) {
437  if (p2_->op() != "const")
438  fs << pipe_delay(p2_, p2_->nbits(), l2);
439  else
440  l2 = 0;
441  }
442  if (l3 > 0) {
443  if (p3_->op() != "const")
444  fs << pipe_delay(p3_, p3_->nbits(), l3);
445  else
446  l3 = 0;
447  }
448 
449  if (op_ == "flag") {
450  for (const auto& cut : cuts_)
451  fs << cut->cut_var()->pipe_delays(step_);
452  }
453 
454  print(fs, verilog, l1, l2, l3);
455  readytoprint_ = false;
456  }
457 }
458 
459 void VarBase::print_all(std::ofstream& fs, Verilog) {
460  for (int i = 0; i <= step_; ++i) {
461  fs << "//\n// STEP " << i << "\n\n";
462  print_step(i, fs, verilog);
463  }
464 }
465 
466 void VarBase::design_print(const std::vector<VarBase*>& v, std::ofstream& fs, Verilog) {
467  //step at which all the outputs should be valid
468  int maxstep = 0;
469 
470  //header of the module
471 
472  //inputs
473  std::vector<VarBase*> vd;
474  vd.clear();
475  int imax = v.size();
476  for (int i = 0; i < imax; ++i) {
477  (v[i])->inputs(&vd);
478  int step = v[i]->step() + v[i]->latency();
479  if (step > maxstep)
480  maxstep = step;
481  }
482 
483  //print header
484  fs << "module \n";
485  fs << "(\n";
486  fs << " input clk,\n";
487  fs << " input reset,\n\n";
488 
489  imax = vd.size();
490  for (int i = 0; i < imax; ++i)
491  fs << " input [" << (vd[i])->nbits() - 1 << ":0] " << (vd[i])->name() << "_wire,\n";
492  fs << "\n";
493 
494  imax = v.size() - 1;
495  for (int i = 0; i < imax; ++i)
496  if (v[i]->nbits() > 1)
497  fs << " output [" << (v[i])->nbits() - 1 << ":0] " << (v[i])->name() << "_wire,\n";
498  else
499  fs << " output " << (v[i])->name() << "_wire,\n";
500  if (imax >= 0) {
501  if (v[imax]->nbits() > 1)
502  fs << " output [" << (v[imax])->nbits() - 1 << ":0] " << (v[imax])->name() << "_wire\n";
503  else
504  fs << " output " << (v[imax])->name() << "_wire\n";
505  }
506  fs << ");\n\n";
507 
508  //body of the module
509  imax = v.size();
510  for (int i = 0; i < imax; ++i) {
511  fs << "\n//\n";
512  fs << "// calculating " << (v[i])->name() << "\n";
513  fs << "//\n";
514  (v[i])->print_all(fs, verilog);
515  }
516  fs << "\n";
517 
518  //trailer
519  fs << "\n";
520  fs << "\n//\n";
521  fs << "// wiring the outputs \n";
522  fs << "// latency = " << maxstep << "\n";
523  fs << "//\n";
524  for (int i = 0; i < imax; ++i) {
525  std::string n = v[i]->name() + "_wire";
526  int delay = maxstep - v[i]->step() - v[i]->latency();
527  if (delay == 0)
528  fs << "assign " << n << " = " << (v[i])->name() << ";\n";
529  else
530  fs << pipe_delay_wire(v[i], n, v[i]->nbits(), delay);
531  }
532 
533  fs << "endmodule\n";
534 }
int step() const
Definition: imath.h:250
Log< level::Info, true > LogVerbatim
int latency_
Definition: imath.h:301
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
unsigned int mask_
Definition: imath.h:1046
void inputs(std::vector< VarBase * > *vd)
Definition: imath.cc:205
void print_step(int step, std::ofstream &fs, Verilog)
void print_all(std::ofstream &fs, Verilog)
VarBase * cut_var()
Definition: imath.cc:388
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
VarBase * p1_
Definition: imath.h:297
VarBase * cut_var_
Definition: imath.h:309
std::string kstring() const
Definition: imath.cc:18
double K() const
Definition: imath.h:246
VarBase * p2_
Definition: imath.h:298
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
std::string op() const
Definition: imath.h:208
assert(be >=bs)
static struct trklet::VarBase::Verilog verilog
VarBase * p3_
Definition: imath.h:299
std::string op_
Definition: imath.h:300
int Nelements_
Definition: imath.h:1048
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
double lower_cut_
Definition: imath.h:1090
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
int nbits() const
Definition: imath.h:243
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
void dump_msg()
Definition: imath.cc:96
static std::string itos(int i)
Definition: imath.cc:16
long int ival_
Definition: imath.h:305
std::vector< DeviationSensor2D * > vd
int latency() const
Definition: imath.h:251
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
virtual void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0)
Definition: imath.h:256
bool readytoprint_
Definition: imath.h:319
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
int shift() const
Definition: imath.h:247
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
double upper_cut() const
Definition: imath.h:1071
double upper_cut_
Definition: imath.h:1091
void print(std::map< const VarBase *, std::set< std::string > > &cut_strings, const int step, Verilog, const std::map< const VarBase *, std::set< std::string > > *const previous_cut_strings=nullptr) const
static std::string pipe_delay_wire(VarBase *v, std::string name_delayed, int nbits, int delay)
Definition: imath.cc:196
void print_truncation(std::string &t, const std::string &o1, const int ps, Verilog) const
std::string name() const
Definition: imath.h:207
void writeLUT(std::ofstream &fs) const
Definition: imath.h:1007
std::vector< VarBase * > cuts_
Definition: imath.h:308
std::string name_
Definition: imath.h:296
static std::string pipe_delay(VarBase *v, int nbits, int delay)
Definition: imath.cc:173
static void design_print(const std::vector< VarBase * > &v, std::ofstream &fs, Verilog)
double K_
Definition: imath.h:312
void print_cuts(std::map< const VarBase *, std::set< std::string > > &cut_strings, const int step, Verilog, const std::map< const VarBase *, std::set< std::string > > *const previous_cut_strings=nullptr) const
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
int shift1
Definition: imath.h:594
int shift2
Definition: imath.h:595
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
static std::string const separator(":")
step
Definition: StallMonitor.cc:94
std::vector< unsigned short int > LUT
Definition: DTTracoLUTs.h:31
unsigned int shift_
Definition: imath.h:1045
void print(std::ofstream &fs, Verilog, int l1=0, int l2=0, int l3=0) override
double lower_cut() const
Definition: imath.h:1070