Belle II Software  release-05-01-25
JLUT.cc
1 //-----------------------------------------------------------------------------
2 // $Id$
3 //-----------------------------------------------------------------------------
4 // Filename : JLUT.cc
5 // Section : TRG CDC
6 // Owner : Jaebak KIM (K.U.)
7 // Email : jbkim@hep.korea.ac.kr
8 //-----------------------------------------------------------------------------
9 // Description : A class for LUT in TRGCDC
10 //-----------------------------------------------------------------------------
11 // $Log$
12 //-----------------------------------------------------------------------------
13 
14 #define TRG_SHORT_NAMES
15 #define TRGCDC_SHORT_NAMES
16 
17 #ifndef __EXTERNAL__
18 #include "trg/cdc/JLUT.h"
19 #include "trg/cdc/FpgaUtility.h"
20 #include "trg/cdc/JSignal.h"
21 #include "trg/cdc/JSignalData.h"
22 #else
23 #include "JLUT.h"
24 #include "FpgaUtility.h"
25 #include "JSignal.h"
26 #include "JSignalData.h"
27 #endif
28 #include <algorithm>
29 #include <iostream>
30 #include <sstream>
31 #include <fstream>
32 #include <cstdlib>
33 #include <cmath>
34 
35 using namespace std;
36 
37 namespace Belle2 {
43  std::string TRGCDCJLUT::version(void) const
44  {
45  return string("TRGCDCJLUT 0.00");
46  }
47 
48  TRGCDCJLUT::TRGCDCJLUT(const string& name)
49  : m_name(name),
50  m_outputFlag(0), m_inputBitsize(0), m_outputBitsize(0),
51  m_inputOffset(0), m_outputOffset(0), m_outputIntMax(0),
52  m_inputToReal(0), m_toReal(0), m_inputShiftBits(0),
53  m_outputType(0), m_outputNBitsWithOffset(0)
54  {
55  m_write = 0;
56  }
57 
59  : m_const(in.m_const),
60  m_name(in.m_name),
61  m_fileName(in.m_fileName),
62  m_function(in.m_function),
63  m_floatFunction(in.m_floatFunction),
64  m_inputMin(in.m_inputMin),
65  m_inputMax(in.m_inputMax),
66  m_shiftOutputMin(in.m_shiftOutputMin),
67  m_shiftOffsetOutputMax(in.m_shiftOffsetOutputMax)
68  {
77  m_toReal = in.m_toReal;
80  m_write = 0;
81  }
82 
84  {
85  }
86 
87  void TRGCDCJLUT::setData(int inputBitsize, int outputBitsize, const string& filename, bool twosComplement)
88  {
89  ifstream coeFile;
90  coeFile.open(filename.c_str());
91  if (coeFile.fail()) {
92  cout << "TRGCDCJLUT !!! can not open file : " << filename << endl;
93  cout << " LUT is not initialized yet" << endl;
94  return;
95  } else {
96  // Set values
97  setInputBitsize(inputBitsize);
98  setOutputBitsize(outputBitsize);
99  m_fileName = filename;
100  setOutputFlag(1);
101  int inputSize = pow(2, inputBitsize);
102  m_data.resize(inputSize);
103  // Read file
104  string t_line;
105  stringstream reformatCoeFile;
106  // Reformat file.
107  while (getline(coeFile, t_line)) {
108  // Remove all spaces
109  t_line.erase(remove_if(t_line.begin(), t_line.end(), ::isspace), t_line.end());
110  // Remove blank lines
111  if (t_line.size() == 0) continue;
112  // Remove all characters after ';'
113  size_t t_iFind = t_line.find(";");
114  if (t_iFind != string::npos) {
115  t_line.erase(t_iFind + 1, string::npos);
116  }
117  // Remove lines for comments
118  if (t_line == ";") continue;
119  // Combine lines until ';'
120  if (t_line.find(";") == string::npos) reformatCoeFile << t_line;
121  // Replace ';' with endl
122  else reformatCoeFile << t_line.substr(0, t_line.size() - 1) << endl;
123  }
124  // Process reformatted file.
125  // vector<string> keywords = {"memory_initialization_radix", "memory_initialization_vector"};
126  int t_radix = 0;
127  vector<string> t_rawData;
128  while (getline(reformatCoeFile, t_line)) {
129  //cout<<t_line<<endl;
130  // Find keywords
131  size_t t_iFind = t_line.find("=");
132  if (t_iFind != string::npos) {
133  // Find values for keywords
134  // Find radix
135  if (t_line.substr(0, t_iFind) == "memory_initialization_radix") {
136  t_radix = atoi(t_line.substr(t_iFind + 1, string::npos).c_str());
137  } else if (t_line.substr(0, t_iFind) == "memory_initialization_vector") {
138  // Find data values
139  string t_dataLine = t_line.substr(t_iFind + 1, string::npos);
140  while (1) {
141  t_iFind = t_dataLine.find(",");
142  if (t_iFind != string::npos) {
143  t_rawData.push_back(t_dataLine.substr(0, t_iFind));
144  t_dataLine.erase(0, t_iFind + 1);
145  } else {
146  // last entry
147  t_rawData.push_back(t_dataLine);
148  break;
149  }
150  } // Finding data values loop
151  } else {
152  cout << "[Error] TRGCDCJLUT::setData() => .coe format keyword is wrong. Aborting" << endl;
153  break;
154  } // End of finding values for keywords
155  } else {
156  cout << "[Error] TRGCDCJLUT::setData() => .coe format is wrong. Needs keywords. Aborting" << endl;
157  break;
158  } // End of finding keywords
159  }
161  //for(auto it=t_rawData.begin(); it!=t_rawData.end(); it++){
162  // cout<<(*it)<<endl;
163  //}
164  if (!twosComplement) {
165  for (int iData = 0; iData < int(t_rawData.size()); iData++) {
166  // Change string to float octal.
167  m_data[iData] = FpgaUtility::arbToDouble(t_rawData[iData], t_radix);
168  }
169  } else {
170  // Find number of bits in binary for data.
171  int nBits = t_rawData[0].size();
172  // Calculate max value.
173  int t_max = pow(t_radix, nBits) - 1;
174  // Calculate number of bits
175  nBits = floor(log(t_max) / log(2)) + 1;
176  for (int iData = 0; iData < int(t_rawData.size()); iData++) {
177  // Change to binary.
178  string t_binary = FpgaUtility::arbToArb(t_rawData[iData], t_radix, 2, nBits);
179  // Change to signed.
180  string t_signedBinary = FpgaUtility::twosComplementToSigned(t_binary);
181  // Change to float octal.
182  m_data[iData] = FpgaUtility::arbToDouble(t_signedBinary, 2);
183  }
184  } // End filling m_data.
185  // Print all values of LUT
186  cout << "LUT(" << m_name << ") data" << endl;
187  for (int iData = 0; iData < int(m_data.size()); iData++) {
188  cout << "[" << iData << "] " << m_data[iData] << endl;
189  }
190  cout << "TTRGCDCJLUT ... LUT(" << m_name << ") initilized with " << filename << endl;
191  }
192  coeFile.close();
193  }
194 
195  void TRGCDCJLUT::setFunction(function<int(int)> function)
196  {
197  m_function = function;
198  }
199 
200 
201  int TRGCDCJLUT::setFloatFunction(function<double(double)> function,
202  TRGCDCJSignal const& input,
203  //TRGCDCJSignal const & outputMin, TRGCDCJSignal const & outputMax,
204  TRGCDCJSignal const& minInv, TRGCDCJSignal const& maxInv, double outputToReal,
205  int lutInputBitwidth, int lutOutputBitwidth)
206  {
207 
208  signed long long t_int;
209  double t_toReal;
210  double t_actual;
211  TRGCDCJSignalData* t_commonData;
212 
213  // Save values.
214  m_inputBitsize = lutInputBitwidth;
215  m_outputBitsize = lutOutputBitwidth;
216  m_floatFunction = function;
217  // Create input min and max.
218  t_int = input.getMinInt();
219  t_toReal = input.getToReal();;
220  t_actual = input.getMinActual();
221  t_commonData = input.getCommonData();
222  m_inputMin = Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, t_commonData);
223  t_int = input.getMaxInt();
224  t_actual = input.getMaxActual();
225  m_inputMax = Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, t_commonData);
226 
227  //cout<<"<<<m_inputMin>>>"<<endl; m_inputMin.dump();
228  //cout<<"<<<m_inputMax>>>"<<endl; m_inputMin.dump();
229 
230  // Calculates number of bits to shift for input.
231  //int t_offsetNBits = m_inputMax.offset(m_inputMin, m_inputMax).getBitsize();
232  int t_offsetNBits = m_inputMax.offset(m_inputMin).getBitsize();
233  m_inputShiftBits = t_offsetNBits - lutInputBitwidth;
234  if (m_inputShiftBits < 0) {
235  m_inputShiftBits = 0;
236  //cout<<"[Warning] TRGCDCJLUT::setFloatFunction() => Changing m_inputBitsize from "<<lutInputBitwidth<<" to optimal bitwidth "<<t_offsetNBits<<". "<<endl;
237  m_inputBitsize = t_offsetNBits;
238  }
239 
240  // Calculates number of bits to shift for lut output bitwidth to be lutOutputBitwidth.
241  //cout<<"<<<minInv>>>"<<endl; minInv.dump();
242  //cout<<"<<<maxInv>>>"<<endl; maxInv.dump();
243  double t_outputRealMinInt = function(minInv.getRealInt());
244  double t_outputRealMaxInt = function(maxInv.getRealInt());
245  if (std::isnan(t_outputRealMinInt)) {
246  cout << "[Error] TRGCDCJLUT::setFloatFunction() => t_outputRealMinInt is nan. Please change minInv signal so that function(minInv.getRealInt()) does not give nan."
247  << endl;
248  }
249  if (std::isnan(t_outputRealMaxInt)) {
250  cout << "[Error] TRGCDCJLUT::setFloatFunction() => t_outputRealMaxInt is nan. Please change maxInv so that function(maxInv.getRealInt()) does not give nan"
251  << endl;
252  }
253  if (t_outputRealMaxInt < t_outputRealMinInt) {
254  cout << "[Error] TRGCDCJLUT::setFloatFunction() => t_outputRealMaxInt is smaller than t_outputRealMinInt." << endl;
255  return 0;
256  }
257  double t_outputMinActual = function(minInv.getActual());
258  double t_outputMaxActual = function(maxInv.getActual());
259  double t_outputToReal;
260  t_outputToReal = outputToReal;
261  double tt_factor = log((max(t_outputRealMaxInt, abs(t_outputRealMinInt)) - t_outputRealMinInt) / ((pow(2,
262  lutOutputBitwidth) - 0.5) * t_outputToReal)) / log(2);
263  tt_factor = ceil(tt_factor);
264  // Create outputMin.
265  //cout<<"t_outputRealMinInt:"<<t_outputRealMinInt<<" t_outputToReal:"<<t_outputToReal<<" tt_factor:"<<tt_factor<<endl;
266  //cout<<"rountInt:"<<t_outputRealMinInt / t_outputToReal / pow(2, tt_factor)<<endl;
267  t_int = FpgaUtility::roundInt(t_outputRealMinInt / t_outputToReal / pow(2, tt_factor));
268  t_toReal = t_outputToReal * pow(2, tt_factor);
269  t_actual = t_outputMinActual;
270  //cout<<"t_int:"<<t_int<<" t_toReal:"<<t_toReal<<" t_actual:"<<t_actual<<endl;
271  Belle2::TRGCDCJSignal t_shiftOutputMin = Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1,
272  t_commonData);
273  //cout<<"<<<t_shiftOutputMin>>>"<<endl; t_shiftOutputMin.dump();
274  //cout<<"minInvRealInt: "<<minInv.getRealInt()<<" RealMinInt: "<<t_outputRealMinInt<<" int: "<<t_int<<endl;
275  //cout<<"minInvActual: "<<minInv.getActual()<<" minActual: "<<t_outputMinActual<<endl;
276  // Create outputMax.
277  t_int = FpgaUtility::roundInt(t_outputRealMaxInt / t_shiftOutputMin.getToReal()) - t_shiftOutputMin.getInt();
278  t_toReal = t_shiftOutputMin.getToReal();
279  t_actual = t_outputMaxActual - t_shiftOutputMin.getActual();
280  Belle2::TRGCDCJSignal t_shiftOffsetOutputMax = Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual,
281  -1, t_commonData);
282  //cout<<"maxInv: "<<maxInv.getRealInt()<<" RealMaxInt: "<<t_outputRealMaxInt<<" int: "<<FpgaUtility::roundInt(t_outputRealMaxInt/t_shiftOutputMin.getToReal())<<endl;
283  //cout<<"maxInvActual: "<<maxInv.getActual()<<" maxActual: "<<t_outputMaxActual<<endl;
284  //cout<<"<<<t_shiftOffsetOutputMax>>>"<<endl; t_shiftOffsetOutputMax.dump();
285 
287  m_shiftOutputMin = t_shiftOutputMin;
288  m_shiftOffsetOutputMax = t_shiftOffsetOutputMax;
289 
290  // Save value for operator function.
291  //cout<<"actual_range: "<<max(outputActualMax, abs(outputActualMin)) - outputActualMin<<endl;
292  //cout<<"int_range: "<<(pow(2,requiredNBits)-0.5)<<endl;
293  //cout<<"intReal_range: "<<(pow(2,requiredNBits)-0.5)*outputToReal<<endl;
294  //cout<<"outputToReal: "<<outputToReal<<endl;
295  //cout<<"actual/int: "<<(max(outputActualMax, abs(outputActualMin)) - outputActualMin)/((pow(2,requiredNBits)-0.5)*outputToReal)<<endl;
296  //cout<<"t_factor_raw: "<<log((max(outputActualMax, abs(outputActualMin)) - outputActualMin)/((pow(2,requiredNBits)-0.5)*outputToReal))/log(2)<<endl;
297  //cout<<"t_factor: "<<t_factor<<endl;
298  //cout<<"m_outputOffset: "<<m_outputOffset<<endl;
299  //cout<<"m_outputType: "<<m_outputType<<endl;
300  //cout<<"m_outputNBits: "<<m_outputNBitsWithOffset<<endl;
301  //cout<<"m_toReal: "<<m_toReal<<endl;
302  // Set integer function.
303  m_function = [&](int anInt) ->
304  int{
305  // Limit input
306  if (anInt < 0)
307  {
308  if (m_write != 1) cout << "[Warning] TRGCDCJLUT::m_function => input is smaller then 0. Changed to 0." << endl;
309  anInt = 0;
310  }
311  double t_input = (anInt + m_inputMin.shift(m_inputShiftBits, 0).getInt()) * m_inputMin.shift(m_inputShiftBits, 0).getToReal();
312  double t_realResult = m_floatFunction(t_input);
313  double result = FpgaUtility::roundInt(t_realResult / m_shiftOutputMin.getToReal() - m_shiftOutputMin.getInt());
314  // Limit output according to requiredNBits
315  if (result < 0)
316  {
317  result = 0;
318  }
319  if (result > m_shiftOffsetOutputMax.getInt())
320  {
321  result = m_shiftOffsetOutputMax.getInt();
322  }
323  // Warnings. Use ideal result for checking output.
324  double t_inputActual = anInt * m_inputMin.shift(m_inputShiftBits, 0).getToReal() + m_inputMin.getActual();
325  double t_outputActual = m_floatFunction(t_inputActual);
326  if (t_outputActual < m_shiftOutputMin.getActual())
327  {
328  if (m_write != 1) {
329  cout << "[Warning] TRGCDCJLUT::m_function => output is smaller then 0. Changed to 0." << endl;
330  cout << "Could happen if invY_min and invY_max are inside x range." << endl;
331  }
332  }
333  if (t_outputActual > m_shiftOffsetOutputMax.getActual() + m_shiftOutputMin.getActual())
334  {
335  if (m_write != 1) {
336  cout << "[Warning] TRGCDCJLUT::m_function => output is larger then allowed max value. Changed to " <<
337  m_shiftOffsetOutputMax.getInt() << "." << endl;
338  cout << "Could happen if invY_min and invY_max are inside x range." << endl;
339  }
340  }
341  return result;
342  };
343 
344  return 1;
345  }
346 
347 
348  void TRGCDCJLUT::setBitsize(int inputBitsize, int outputBitsize)
349  {
350  setInputBitsize(inputBitsize);
351  setOutputBitsize(outputBitsize);
352  }
353 
354  void TRGCDCJLUT::setOutputFlag(int outputFlag)
355  {
356  m_outputFlag = outputFlag;
357  }
358 
359  void TRGCDCJLUT::setInputBitsize(int inputBitsize)
360  {
361  m_inputBitsize = inputBitsize;
362  }
363 
364  void TRGCDCJLUT::setOutputBitsize(int outputBitsize)
365  {
366  m_outputBitsize = outputBitsize;
367  }
368 
369  string TRGCDCJLUT::getFileName() const
370  {
371  return m_fileName;
372  }
373 
375  {
376  return m_inputBitsize;
377  }
378 
380  {
381  return m_outputBitsize;
382  }
383 
384  function<int(int)> TRGCDCJLUT::getFunction()
385  {
386  return m_function;
387  }
388 
389  function<double(double)> TRGCDCJLUT::getFloatFunction()
390  {
391  return m_floatFunction;
392  }
393 
395  {
396  return m_outputFlag;
397  }
398 
400  {
401  return m_outputType;
402  }
403 
404  int TRGCDCJLUT::getOutput(int input) const
405  {
406  return m_function(input);
407  }
408 
409  double TRGCDCJLUT::getFloatOutput(double input) const
410  {
411  return m_floatFunction(input);
412  }
413 
415  {
416  cout << "<<<[LUT] " << m_name << ">>>" << endl;
417  if (m_fileName != "") cout << "LUT filename: " << m_fileName << endl;
418  cout << "In bitsize: " << m_inputBitsize << " Out bitsize: " << m_outputBitsize << endl;
419  cout << "[input] offset: " << m_inputOffset << " toReal: " << m_inputToReal << endl;
420  cout << "[output] offset: " << m_outputOffset << " toReal: " << m_toReal << endl;
421  cout << "[output] type: " << m_outputType << " NBitsWithOffset: " << m_outputNBitsWithOffset << endl;
422  cout << "<<<[LUT] " << m_name << ">>>" << endl;
423  }
424 
426  void TRGCDCJLUT::makeCOE(string fileName)
427  {
428  m_write = 1;
429  // Check if function is set.
430  if (!m_function.operator bool()) {
431  cout << "[Error] TRGCDCJLUT::makeCOE() => m_function is not set. Aborting." << endl;
432  return;
433  }
434  // Check if m_inputBitsize is set.
435  if (m_inputBitsize == 0) {
436  cout << "[Error] TRGCDCJLUT::makeCOE() => inputBitSize is not set. Aborting." << endl;
437  return;
438  }
439  // Set file name.
440  string t_fileName;
441  if (fileName != "") t_fileName = fileName;
442  else if (name() != "") {
443  t_fileName = name();
444  t_fileName += ".coe";
445  } else t_fileName = "untitled.coe";
446  // Create file.
447  ofstream coeFile;
448  coeFile.open(t_fileName.c_str());
449 
450  coeFile << "* [Information for COE " << fileName << " ]" << endl;
451  coeFile << "* in_real = in * " << m_inputMin.getToReal() << endl;
452  coeFile << "* LUT_in = (in - " << m_inputMin.getInt() << ") * 2^" << m_inputShiftBits << endl;
453  coeFile << "* x = (LUT_in + " << m_inputMin.getInt() << " * 2^" << m_inputShiftBits << ") * " << m_inputMin.shift(m_inputShiftBits,
454  0).getToReal() << endl;
455  coeFile << "* y_int = round( f(x) / " << m_shiftOutputMin.getToReal() << " - " << m_shiftOutputMin.getInt() << " )" << endl;
456  coeFile << "* LUT_out = Limit to 0 < y_int < " << m_shiftOffsetOutputMax.getInt() << endl;
457  coeFile << "* out = LUT_out + " << m_shiftOutputMin.getInt() << endl;
458  coeFile << "* out_Real = out * " << m_shiftOutputMin.getToReal() << endl;
459 
460  // Meta data for file.
461  coeFile << "memory_initialization_radix=10;" << endl;
462  coeFile << "memory_initialization_vector=" << endl;
463  // Fill content of file.
464  for (unsigned index = 0; index < pow(2, m_inputBitsize) - 1; index++) {
465  //cout<<"Directly: "<<m_function(index)<<endl;
466  //cout<<"Indirect: "<<getOutput(index)<<endl;
467  coeFile << m_function(index) << "," << endl;
468  }
469  coeFile << m_function(pow(2, m_inputBitsize) - 1) << ";" << endl;
470  // Close file.
471  coeFile.close();
472  m_write = 0;
473  }
474 
475  // Return name of offset.
476  string TRGCDCJLUT::operate(std::string out, std::string in, std::map<std::string, std::map<std::string, double>* >& m_intStorage)
477  {
478  double floatInput = (*m_intStorage["int"])[in] + m_inputOffset;
479  floatInput *= m_inputToReal;
480  // Make offset value.
481  stringstream t_offsetName;
482  t_offsetName << out << "_o" << m_outputOffset;
483  (*m_intStorage["type"])[t_offsetName.str()] = 1;
484  (*m_intStorage["bitSize"])[t_offsetName.str()] = m_outputBitsize;
485  (*m_intStorage["toReal"])[t_offsetName.str()] = m_toReal;
486  (*m_intStorage["real"])[t_offsetName.str()] = getFloatOutput(floatInput) - m_outputOffset * m_toReal;
487  (*m_intStorage["int"])[t_offsetName.str()] = getOutput((*m_intStorage["int"])[in]);
488  (*m_intStorage["realInt"])[t_offsetName.str()] = (*m_intStorage["int"])[t_offsetName.str()] * m_toReal;
489  // Make no offset value.
490  (*m_intStorage["type"])[out] = m_outputType;
491  (*m_intStorage["bitSize"])[out] = m_outputNBitsWithOffset;
492  (*m_intStorage["toReal"])[out] = m_toReal;
493  (*m_intStorage["real"])[out] = getFloatOutput(floatInput);
494  (*m_intStorage["int"])[out] = getOutput((*m_intStorage["int"])[in]) + m_outputOffset;
495  (*m_intStorage["realInt"])[out] = (*m_intStorage["int"])[out] * m_toReal;;
496 
497  return t_offsetName.str();
498  }
499 
501  {
502 
503  //cout<<"Operate start"<<endl;
504 
505  Belle2::TRGCDCJSignal t_offsetInput;
506  // Offset input. (If needed)
507  if (m_inputMin.getInt() != 0) {
508  //t_offsetInput = in.offset(m_inputMin, m_inputMax);
509  t_offsetInput = in.offset(m_inputMin);
510  } else {
511  t_offsetInput = in;
512  }
513  if (t_offsetInput.getMinInt() != 0) {
514  cout << "[Warning] TRGCDCJLUT::operate() => Offsetted input minInt is not 0." << endl;
515  }
516 
517  //cout<<"in"<<endl;
518  //in.dump();
523  //cout<<"m_inputMin"<<endl;
524  //m_inputMin.dump();
525  //cout<<"t_offsetInput"<<endl;
526  //t_offsetInput.dump();
527 
528  // Set m_shiftOffsetInput.
529  // [TODO] Change to constructor?
530  m_shiftOffsetInput.setName("lut_" + out.getName() + "_in");
531  // To remove warning of no m_commonData.
533 
534  // Shift input (If needed)
535  string t_shiftOffsetInputCode = "";
537  t_offsetInput.calFinishClock(), t_shiftOffsetInputCode);
538  else m_shiftOffsetInput.assignTo(Belle2::TRGCDCJSignal::toSlv(t_offsetInput), t_offsetInput.calFinishClock(),
539  t_shiftOffsetInputCode);
542 
543  //cout<<"m_inputShiftBits"<<endl;
544  //cout<<m_inputShiftBits<<endl;
545  //cout<<"m_offsetShiftInput"<<endl;
546  //m_shiftOffsetInput.dump();
547 
548  // Get output of LUT and invOffset it.
549  signed long long intOutput = getOutput(m_shiftOffsetInput.getInt());
550  //signed long long intOutput = getOutput(in.getInt());
551  int t_finishClock;
552  // Create offsetted output signal.
553  double t_actual = getFloatOutput(in.getActual()) - m_shiftOutputMin.getActual();
554  TRGCDCJSignalData* t_commonData = in.getCommonData();
555  t_finishClock = in.getFinishClock() + 1;
556  Belle2::TRGCDCJSignal t_offsetOutput(intOutput, m_shiftOutputMin.getToReal(), 0, m_shiftOffsetOutputMax.getInt(), t_actual, 0,
557  m_shiftOffsetOutputMax.getActual(), t_finishClock, t_commonData, 1);
558  t_offsetOutput.setName("lut_" + out.getName() + "_out");
559 
561  //cout<<"t_offsetOutput"<<endl;
562  //t_offsetOutput.dump();
568 
569  //out <= t_offsetOutput.invOffset(m_shiftOutputMin,m_shiftOutputMin+m_shiftOffsetOutputMax);
570  out <= t_offsetOutput.invOffset(m_shiftOutputMin);
571 
572  //cout<<"m_shiftOutputMin"<<endl;
573  //m_shiftOutputMin.dump();
574  //cout<<"out"<<endl;
575  //out.dump();
576 
577  // Print Vhdl code.
578  if (out.getPrintVhdl() == 1) {
579  string t_finalCode = lutVhdlCode(t_shiftOffsetInputCode);
580  out.getCommonData()->setVhdlOutProcess(out.getCommonData()->getVhdlOutProcess() + t_finalCode);
581  // Fill signal map for definition.
582  {
583  map<string, vector<int> >& t_signals = out.getCommonData()->m_signals;
584  if (t_signals.find(t_offsetOutput.getName()) == t_signals.end()) {
585  t_signals[t_offsetOutput.getName()] = {t_offsetOutput.getType(), (int)t_offsetOutput.getBitsize()};
586  }
587  }
588  }
589 
590  //cout<<"Operate end"<<endl;
591 
592  // LUT result value
593  return t_offsetOutput;
594  }
595 
596  std::string const TRGCDCJLUT::lutVhdlCode(string const& shiftOffsetInput) const
597  {
598  //cout<<shiftOffsetInput.getFinalCode()<<endl;
599  //cout<<out.getFinalCode()<<endl;
600  stringstream t_vhdlCode;
601  t_vhdlCode << "lut_" << m_name << "_i: entity work.lut_" << m_name << endl;
602  t_vhdlCode << " port map(" << endl;
603  t_vhdlCode << " clka=>CLKIN, " << endl;
604  t_vhdlCode << " addra=>lut_" << m_name << "_in," << endl;
605  t_vhdlCode << " douta=>lut_" << m_name << "_out" << endl;
606  t_vhdlCode << ");" << endl;
607  t_vhdlCode << shiftOffsetInput << endl;
608  return t_vhdlCode.str();
609  }
610 
612 }
Belle2::TRGCDCJLUT::getInputBitsize
int getInputBitsize() const
get input bitsize
Definition: JLUT.cc:374
Belle2::TRGCDCJSignal::setVhdlOutputFile
void setVhdlOutputFile(std::string filename)
Sets ouptut VHDL filename.
Definition: JSignal.cc:1353
Belle2::TRGCDCJLUT::m_outputIntMax
double m_outputIntMax
The integer offset of the output for LUT.
Definition: JLUT.h:168
Belle2::TRGCDCJSignal::getInt
signed long long getInt() const
Get integer value of signal.
Definition: JSignal.cc:1381
Belle2::TRGCDCJSignal::calFinishClock
int calFinishClock() const
Claculates the clock tick where the signal is valid.
Definition: JSignal.cc:1481
Belle2::TRGCDCJLUT::m_outputBitsize
int m_outputBitsize
output bitsize. Number of bits.
Definition: JLUT.h:156
FpgaUtility::roundInt
static double roundInt(double value)
Round double value.
Definition: FpgaUtility.cc:31
Belle2::TRGCDCJSignal::setName
void setName(std::string name)
Setters, Getters Sets name of signal.
Definition: JSignal.cc:1302
Belle2::TRGCDCJSignal::setPrintVhdl
void setPrintVhdl(bool printVhdl)
Sets print flag for signal.
Definition: JSignal.cc:1345
FpgaUtility::twosComplementToSigned
static std::string twosComplementToSigned(std::string in)
Changes string two complements to string signed binary(-sign).
Definition: FpgaUtility.cc:156
Belle2::TRGCDCJLUT::m_write
bool m_write
VHDL write flag for signals. 1: Write is on. 0: Write is off.
Definition: JLUT.h:159
Belle2::TRGCDCJLUT::getOutput
int getOutput(int) const
get output using int values.
Definition: JLUT.cc:404
Belle2::TRGCDCJLUT::m_inputToReal
double m_inputToReal
The factor of the input integer to change to float value.
Definition: JLUT.h:171
Belle2::TRGCDCJLUT::m_shiftOffsetOutputMax
TRGCDCJSignal m_shiftOffsetOutputMax
The maximum output value that is bit shifted.
Definition: JLUT.h:195
Belle2::TRGCDCJSignal::getCommonData
TRGCDCJSignalData * getCommonData() const
Get the sharged JSignalData.
Definition: JSignal.cc:1441
Belle2::TRGCDCJSignal::getType
int getType() const
Get type of signal.
Definition: JSignal.cc:1371
Belle2::TRGCDCJSignal::setCommonData
void setCommonData(TRGCDCJSignalData *)
Sets JSignalData to signal.
Definition: JSignal.cc:1361
Belle2::TRGCDCJLUT::name
std::string name(void) const
Operators.
Definition: JLUT.h:206
Belle2::TRGCDCJLUT::lutVhdlCode
const std::string lutVhdlCode(std::string const &shiftOffsetInput) const
Creates vhdlCode for lut.
Definition: JLUT.cc:596
Belle2::TRGCDCJLUT::m_outputType
double m_outputType
The output type of the LUT. (Will be deprecated.)
Definition: JLUT.h:180
Belle2::TRGCDCJLUT::m_outputFlag
int m_outputFlag
Flag for output. 0 is from function. 1 is from LUT file.
Definition: JLUT.h:150
Belle2::TRGCDCJSignal::getActual
double getActual() const
Get float value of signal.
Definition: JSignal.cc:1396
Belle2::TRGCDCJLUT::m_name
std::string m_name
Name.
Definition: JLUT.h:135
Belle2::TRGCDCJLUT::setInputBitsize
void setInputBitsize(int inputBitsize)
set input bitsize.
Definition: JLUT.cc:359
Belle2::TRGCDCJLUT::setBitsize
void setBitsize(int inputBitsize, int outputBitsize)
set input & output bitsize.
Definition: JLUT.cc:348
Belle2::TRGCDCJSignal
A class to use Signals for TRGCDC 3D tracker.
Definition: JSignal.h:36
Belle2::TRGCDCJSignal::getFinishClock
int getFinishClock() const
Gets clock tick where signal is make.
Definition: JSignal.cc:1431
Belle2::TRGCDCJLUT::getOutputType
int getOutputType() const
get output type.
Definition: JLUT.cc:399
Belle2::TRGCDCJLUT::getOutputBitsize
int getOutputBitsize() const
get output bitsize
Definition: JLUT.cc:379
Belle2::TRGCDCJLUT::m_inputOffset
double m_inputOffset
Changing float function to int function variables.
Definition: JLUT.h:162
Belle2::TRGCDCJLUT::getFunction
std::function< int(int)> getFunction()
get LUT function using int values.
Definition: JLUT.cc:384
Belle2::TRGCDCJLUT::getFileName
std::string getFileName() const
get LUT filename
Definition: JLUT.cc:369
Belle2::TRGCDCJLUT::m_toReal
double m_toReal
The factor to change integer to float value.
Definition: JLUT.h:174
Belle2::TRGCDCJLUT::m_floatFunction
std::function< double(double)> m_floatFunction
Float LUT function.
Definition: JLUT.h:147
Belle2::TRGCDCJLUT::m_inputBitsize
int m_inputBitsize
input bitsize. Number of bits.
Definition: JLUT.h:153
Belle2::TRGCDCJLUT::m_outputOffset
double m_outputOffset
The float offset of the output for LUT.
Definition: JLUT.h:165
Belle2::TRGCDCJSignal::invOffset
const TRGCDCJSignal invOffset(TRGCDCJSignal const &valueMin) const
Outputs a signal that is not offset.
Definition: JSignal.cc:607
Belle2::TRGCDCJSignal::getVhdlOutputFile
std::string getVhdlOutputFile() const
Gets the vhdl output file name.
Definition: JSignal.cc:1510
Belle2::TRGCDCJSignalData
A class to hold common data for JSignals.
Definition: JSignalData.h:34
Belle2::TRGCDCJLUT::m_shiftOutputMin
TRGCDCJSignal m_shiftOutputMin
The minimum output signal that is bit shifted.
Definition: JLUT.h:192
Belle2::TRGCDCJLUT::setOutputBitsize
void setOutputBitsize(int outputBitsize)
set output bitsize.
Definition: JLUT.cc:364
Belle2::TRGCDCJLUT::~TRGCDCJLUT
virtual ~TRGCDCJLUT()
Destructor.
Definition: JLUT.cc:83
Belle2::TRGCDCJLUT::setData
void setData(int inputBitsize, int outputBitSize, const std::string &filename, bool twoscomplement=0)
set LookUpTable(LUT) data.
Definition: JLUT.cc:87
Belle2::TRGCDCJLUT::setFunction
void setFunction(std::function< int(int)> function)
set LUT function directly using int values.
Definition: JLUT.cc:195
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TRGCDCJLUT::m_outputNBitsWithOffset
double m_outputNBitsWithOffset
The output bit width with offset. (Will be deprecated.)
Definition: JLUT.h:183
Belle2::TRGCDCJLUT::operate
std::string operate(std::string out, std::string in, std::map< std::string, std::map< std::string, double > * > &m_intStorage)
Operate on LUT. (Will be deprecated.)
Definition: JLUT.cc:476
Belle2::TRGCDCJSignal::getBitsize
double getBitsize() const
Get bitwidth of signal.
Definition: JSignal.cc:1376
Belle2::TRGCDCJSignal::getToReal
double getToReal() const
Get toReal value of signal.
Definition: JSignal.cc:1426
Belle2::TRGCDCJSignal::shift
const TRGCDCJSignal shift(int nBits, int operate=1) const
Shift signal. Shift direction is right. operate=0 to change m_toReal(unit).
Definition: JSignal.cc:562
Belle2::TRGCDCJLUT::setFloatFunction
int setFloatFunction(std::function< double(double)> function, TRGCDCJSignal const &input, TRGCDCJSignal const &minInv, TRGCDCJSignal const &maxInv, double outputToReal, int lutInputBitwidth, int lutOutputBitwidth)
set LUT function using JSignals.
Definition: JLUT.cc:201
Belle2::TRGCDCJLUT::m_fileName
std::string m_fileName
LUT filename.
Definition: JLUT.h:141
FpgaUtility::arbToDouble
static double arbToDouble(std::string in, int inRadix)
Radix changing functions.
Definition: FpgaUtility.cc:53
Belle2::TRGCDCJSignal::offset
const TRGCDCJSignal offset(TRGCDCJSignal const &valueMin) const
Outputs an offset signal which is an unsigned signal.
Definition: JSignal.cc:593
Belle2::TRGCDCJSignal::getRealInt
double getRealInt() const
Get converted float value of integer.
Definition: JSignal.cc:1411
Belle2::TRGCDCJLUT
A class to use LUTs for TRGCDC.
Definition: JLUT.h:36
Belle2::TRGCDCJSignal::getPrintVhdl
bool getPrintVhdl() const
Gets the print vhdl flag from common JSignalData class.
Definition: JSignal.cc:1501
Belle2::TRGCDCJLUT::m_shiftOffsetInput
TRGCDCJSignal m_shiftOffsetInput
The bt shifted offset signal of input.
Definition: JLUT.h:198
Belle2::TRGCDCJLUT::TRGCDCJLUT
TRGCDCJLUT(const std::string &name="no_name")
Contructor.
Definition: JLUT.cc:48
Belle2::TRGCDCJLUT::getOutputFlag
int getOutputFlag() const
get output type.
Definition: JLUT.cc:394
Belle2::TRGCDCJLUT::m_inputMin
TRGCDCJSignal m_inputMin
The minimum input signal.
Definition: JLUT.h:186
Belle2::TRGCDCJSignal::toSlv
static const TRGCDCJSignal toSlv(TRGCDCJSignal const &in, int test)
Change signal to std_logic_vector using vector<bool>. (Will be deprecated.)
Definition: JSignal.cc:1125
Belle2::TRGCDCJLUT::m_function
std::function< int(int)> m_function
LUT function.
Definition: JLUT.h:144
Belle2::TRGCDCJLUT::makeCOE
void makeCOE(std::string="")
make COE file.
Definition: JLUT.cc:426
Belle2::TRGCDCJLUT::setOutputFlag
void setOutputFlag(int outputFlag)
set output flag.
Definition: JLUT.cc:354
Belle2::TRGCDCJLUT::getFloatFunction
std::function< double(double)> getFloatFunction()
get LUT function using float values.
Definition: JLUT.cc:389
FpgaUtility::arbToArb
static std::string arbToArb(std::string &in, int inRadix, int outRadix, int numberOfDigits=-1)
Change string number to another string number depending on radix.
Definition: FpgaUtility.cc:107
Belle2::TRGCDCJSignal::getName
std::string getName() const
Get name of signal.
Definition: JSignal.cc:1366
Belle2::TRGCDCJLUT::getFloatOutput
double getFloatOutput(double) const
get output using float values.
Definition: JLUT.cc:409
Belle2::TRGCDCJLUT::m_data
std::vector< int > m_data
LUT data.
Definition: JLUT.h:138
Belle2::TRGCDCJSignal::assignTo
TRGCDCJSignal & assignTo(TRGCDCJSignal const &rhs, int targetClock, std::string &finalCode)
Assign operator with setting target clock with outputing final code.
Definition: JSignal.cc:173
Belle2::TRGCDCJLUT::dump
void dump()
Print variables for LUT.
Definition: JLUT.cc:414
Belle2::TRGCDCJSignal::getMinInt
signed long long getMinInt() const
Get minimum integer value of signal.
Definition: JSignal.cc:1386
Belle2::TRGCDCJLUT::m_inputMax
TRGCDCJSignal m_inputMax
The maximum input signal.
Definition: JLUT.h:189
Belle2::TRGCDCJLUT::m_inputShiftBits
int m_inputShiftBits
The number of bits to shift to make input the wanted bit width.
Definition: JLUT.h:177