CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
VMRouterCM.cc
Go to the documentation of this file.
10 
13 
14 using namespace std;
15 using namespace trklet;
16 
17 VMRouterCM::VMRouterCM(string name, Settings const& settings, Globals* global)
18  : ProcessBase(name, settings, global), meTable_(settings), diskTable_(settings) {
20 
21  unsigned int region = name[9] - 'A';
23 
24  vmstubsMEPHI_.resize(1, nullptr);
25 
26  overlapbits_ = 7;
28 
29  meTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::me, region); //used for ME and outer TE barrel
30 
32  diskTable_.initVMRTable(layerdisk_, TrackletLUT::VMRTableType::disk, region); //outer disk used by D1, D2, and D4
33  }
34 
37 
38  nvmmebins_ = settings_.NLONGVMBINS() * ((layerdisk_ >= N_LAYER) ? 2 : 1); //number of long z/r bins in VM
39 }
40 
41 void VMRouterCM::addOutput(MemoryBase* memory, string output) {
42  if (settings_.writetrace()) {
43  edm::LogVerbatim("Tracklet") << "In " << name_ << " adding output to " << memory->getName() << " to output "
44  << output;
45  }
46 
47  if (output == "allinnerstubout") {
48  AllInnerStubsMemory* tmp = dynamic_cast<AllInnerStubsMemory*>(memory);
49  assert(tmp != nullptr);
50  char memtype = memory->getName().back();
51  allinnerstubs_.emplace_back(memtype, tmp);
52  return;
53  }
54 
55  if (output.substr(0, 10) == "allstubout") {
56  AllStubsMemory* tmp = dynamic_cast<AllStubsMemory*>(memory);
57  allstubs_.push_back(tmp);
58  return;
59  }
60 
61  if (output.substr(0, 9) == "vmstubout") {
62  unsigned int pos = 12;
63  int vmbin = memory->getName().substr(pos, 1)[0] - '0';
64  pos++;
65  if (pos < memory->getName().size()) {
66  if (memory->getName().substr(pos, 1)[0] != 'n') {
67  vmbin = vmbin * 10 + memory->getName().substr(pos, 1)[0] - '0';
68  pos++;
69  }
70  }
71  if (memory->getName().substr(3, 2) == "TE") {
72  VMStubsTEMemory* tmp = dynamic_cast<VMStubsTEMemory*>(memory);
73  unsigned int iseed = output[output.size() - 1] - '0';
74  assert(iseed < N_SEED_PROMPT);
75 
76  int seedindex = -1;
77  for (unsigned int k = 0; k < vmstubsTEPHI_.size(); k++) {
78  if (vmstubsTEPHI_[k].seednumber == iseed) {
79  seedindex = k;
80  }
81  }
82  if (seedindex == -1) {
83  seedindex = vmstubsTEPHI_.size();
84  vector<VMStubsTEMemory*> vectmp;
85  VMStubsTEPHICM atmp(iseed, vectmp);
86  vmstubsTEPHI_.push_back(atmp);
87  }
88  tmp->resize(settings_.NLONGVMBINS() * settings_.nvmte(1, iseed));
89  vmstubsTEPHI_[seedindex].vmstubmem.push_back(tmp);
90 
91  } else if (memory->getName().substr(3, 2) == "ME") {
92  VMStubsMEMemory* tmp = dynamic_cast<VMStubsMEMemory*>(memory);
93  assert(tmp != nullptr);
95  assert(vmstubsMEPHI_[0] == nullptr);
96  vmstubsMEPHI_[0] = tmp;
97  } else {
98  throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " memory: " << memory->getName()
99  << " => should never get here!";
100  }
101 
102  return;
103  }
104 
105  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find output : " << output;
106 }
107 
108 void VMRouterCM::addInput(MemoryBase* memory, string input) {
109  if (settings_.writetrace()) {
110  edm::LogVerbatim("Tracklet") << "In " << name_ << " adding input from " << memory->getName() << " to input "
111  << input;
112  }
113  if (input == "stubin") {
114  InputLinkMemory* tmp1 = dynamic_cast<InputLinkMemory*>(memory);
115  assert(tmp1 != nullptr);
116  if (tmp1 != nullptr) {
117  stubinputs_.push_back(tmp1);
118  }
119  return;
120  }
121  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " Could not find input : " << input;
122 }
123 
125  unsigned int allStubCounter = 0;
126 
127  //Loop over the input stubs
128  for (auto& stubinput : stubinputs_) {
129  for (unsigned int i = 0; i < stubinput->nStubs(); i++) {
130  if (allStubCounter > settings_.maxStep("VMR"))
131  continue;
132  if (allStubCounter >= (1 << N_BITSMEMADDRESS))
133  continue;
134 
135  Stub* stub = stubinput->getStub(i);
136 
137  //Note - below information is not part of the stub, but rather from which input memory
138  //we are reading
139  bool negdisk = (stub->disk().value() < 0);
140 
141  //use &127 to make sure we fit into the number of bits -
142  //though we should have protected against overflows above
143  FPGAWord allStubIndex(allStubCounter & ((1 << N_BITSMEMADDRESS) - 1), N_BITSMEMADDRESS, true, __LINE__, __FILE__);
144 
145  //TODO - should not be needed - but need to migrate some other pieces of code before removing
146  stub->setAllStubIndex(allStubCounter);
147  //TODO - should not be needed - but need to migrate some other pieces of code before removing
148  stub->l1tstub()->setAllStubIndex(allStubCounter);
149 
150  allStubCounter++;
151 
152  for (auto& allstub : allstubs_) {
153  allstub->addStub(stub);
154  if (settings_.debugTracklet()) {
155  edm::LogVerbatim("Tracklet") << getName() << " adding stub to " << allstub->getName();
156  }
157  }
158 
159  FPGAWord iphi = stub->phicorr();
160  unsigned int iphipos = iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + N_PHIBITS), N_PHIBITS);
161 
162  unsigned int phicutmax = 4;
163  unsigned int phicutmin = 4;
164 
165  if (layerdisk_ != 0) {
166  phicutmax = 6;
167  phicutmin = 2;
168  }
169 
170  //Fill inner allstubs memories - in HLS this is the same write to multiple memories
171  for (auto& allstub : allinnerstubs_) {
172  char memtype = allstub.first;
173  if (memtype == 'R' && iphipos < phicutmax)
174  continue;
175  if (memtype == 'L' && iphipos >= phicutmin)
176  continue;
177  if (memtype == 'A' && iphipos < 4)
178  continue;
179  if (memtype == 'B' && iphipos >= 4)
180  continue;
181  if (memtype == 'E' && iphipos >= 4)
182  continue;
183  if (memtype == 'F' && iphipos < 4)
184  continue;
185  if (memtype == 'C' && iphipos >= 4)
186  continue;
187  if (memtype == 'D' && iphipos < 4)
188  continue;
189 
190  int absz = std::abs(stub->z().value());
192  continue;
195  continue;
197  stub->r().value() > VMROUTERCUTRD1D3 / settings_.kr())
198  continue;
199  if ((layerdisk_ == LayerDisk::D1 || layerdisk_ == LayerDisk::D3) && stub->r().value() < 2 * int(N_DSS_MOD))
200  continue;
201  if (layerdisk_ == LayerDisk::L1) {
202  if (memtype == 'M' || memtype == 'R' || memtype == 'L') {
203  if (absz < VMROUTERCUTZL1 / settings_.kz(layerdisk_))
204  continue;
205  } else {
207  continue;
208  }
209  }
210 
211  if (settings_.debugTracklet()) {
212  edm::LogVerbatim("Tracklet") << getName() << " adding stub to " << allstub.second->getName();
213  }
214 
215  allstub.second->addStub(stub);
216  }
217 
218  //Fill all the ME VM memories
219  unsigned int ivm =
222 
223  //Calculate the z and r position for the vmstub
224 
225  //Take the top nbitszfinebintable_ bits of the z coordinate
226  int indexz = (stub->z().value() >> (stub->z().nbits() - nbitszfinebintable_)) & ((1 << nbitszfinebintable_) - 1);
227  int indexr = -1;
228  if (layerdisk_ > (N_LAYER - 1)) {
229  if (negdisk) {
230  indexz = ((1 << nbitszfinebintable_) - 1) - indexz;
231  }
232  indexr = stub->r().value();
233  if (stub->isPSmodule()) {
234  indexr = stub->r().value() >> (stub->r().nbits() - nbitsrfinebintable_);
235  }
236  } else {
237  //Take the top nbitsfinebintable_ bits of the z coordinate. The & is to handle the negative z values.
238  indexr = (stub->r().value() >> (stub->r().nbits() - nbitsrfinebintable_)) & ((1 << nbitsrfinebintable_) - 1);
239  }
240 
241  assert(indexz >= 0);
242  assert(indexr >= 0);
243  assert(indexz < (1 << nbitszfinebintable_));
244  assert(indexr < (1 << nbitsrfinebintable_));
245 
246  int melut = meTable_.lookup((indexz << nbitsrfinebintable_) + indexr);
247 
248  assert(melut >= 0);
249 
250  int vmbin = melut >> NFINERZBITS;
251  if (negdisk)
252  vmbin += (1 << NFINERZBITS);
253  int rzfine = melut & ((1 << NFINERZBITS) - 1);
254 
255  // pad disk PS bend word with a '0' in MSB so that all disk bends have 4 bits (for HLS compatibility)
256  int nbendbits = stub->bend().nbits();
257  if (layerdisk_ >= N_LAYER)
258  nbendbits = settings_.nbendbitsmedisk();
259 
260  VMStubME vmstub(
261  stub,
263  FPGAWord(rzfine, NFINERZBITS, true, __LINE__, __FILE__),
264  FPGAWord(stub->bend().value(), nbendbits, true, __LINE__, __FILE__),
265  allStubIndex);
266 
267  assert(vmstubsMEPHI_[0] != nullptr);
268 
269  vmstubsMEPHI_[0]->addStub(vmstub, ivm * nvmmebins_ + vmbin);
270 
271  //Fill the TE VM memories
272  if (layerdisk_ >= N_LAYER && (!stub->isPSmodule()))
273  continue;
274 
275  for (auto& ivmstubTEPHI : vmstubsTEPHI_) {
276  unsigned int iseed = ivmstubTEPHI.seednumber;
277  unsigned int lutwidth = settings_.lutwidthtab(1, iseed);
278 
279  int lutval = -999;
280 
281  if (layerdisk_ < N_LAYER) {
282  lutval = melut;
283  } else {
284  lutval = diskTable_.lookup((indexz << nbitsrfinebintable_) + indexr);
285  if (lutval == 0) {
286  continue;
287  }
288  }
289 
290  assert(lutval >= 0);
291 
292  FPGAWord binlookup(lutval, lutwidth, true, __LINE__, __FILE__);
293 
294  if (binlookup.value() < 0)
295  continue;
296 
297  unsigned int ivmte =
298  iphi.bits(iphi.nbits() - (settings_.nbitsallstubs(layerdisk_) + settings_.nbitsvmte(1, iseed)),
299  settings_.nbitsvmte(1, iseed));
300 
301  int bin = binlookup.value() / 8;
302  unsigned int tmp = binlookup.value() & 7; //three bits in outer layers - this could be coded cleaner...
303  binlookup.set(tmp, 3, true, __LINE__, __FILE__);
304 
305  FPGAWord finephi = stub->iphivmFineBins(settings_.nphireg(1, iseed), settings_.nfinephi(1, iseed));
306 
307  VMStubTE tmpstub(stub, finephi, stub->bend(), binlookup, allStubIndex);
308 
309  unsigned int nmem = ivmstubTEPHI.vmstubmem.size();
310  assert(nmem > 0);
311 
312  for (unsigned int l = 0; l < nmem; l++) {
313  if (settings_.debugTracklet()) {
314  edm::LogVerbatim("Tracklet") << getName() << " try adding stub to " << ivmstubTEPHI.vmstubmem[l]->getName()
315  << " bin=" << bin << " ivmte " << ivmte << " finephi " << finephi.value()
316  << " regions bits " << settings_.nphireg(1, iseed) << " finephibits "
317  << settings_.nfinephi(1, iseed);
318  }
319  ivmstubTEPHI.vmstubmem[l]->addVMStub(tmpstub, ivmte * settings_.NLONGVMBINS() + bin);
320  }
321  }
322  }
323  }
324 }
Log< level::Info, true > LogVerbatim
unsigned int nbendbitsmedisk() const
Definition: Settings.h:92
const FPGAWord & bend() const
Definition: Stub.h:58
const FPGAWord & disk() const
Definition: Stub.h:68
Divides< B, C > D2
Definition: Factorize.h:137
constexpr double VMROUTERCUTZL1L3L5
Definition: Settings.h:45
unsigned int vmrlutrbits(unsigned int layerdisk) const
Definition: Settings.h:179
const FPGAWord & phicorr() const
Definition: Stub.h:63
unsigned int vmrlutzbits(unsigned int layerdisk) const
Definition: Settings.h:178
TrackletLUT diskTable_
Definition: VMRouterCM.h:58
std::string name_
Definition: ProcessBase.h:38
constexpr double VMROUTERCUTZL1
Definition: Settings.h:46
unsigned int nvmmebins_
Definition: VMRouterCM.h:55
int nbits() const
Definition: FPGAWord.h:25
std::vector< InputLinkMemory * > stubinputs_
Definition: VMRouterCM.h:61
unsigned int nvmme(unsigned int layerdisk) const
Definition: Settings.h:104
Settings const & settings_
Definition: ProcessBase.h:40
bool isPSmodule() const
Definition: Stub.h:71
std::vector< std::pair< char, AllInnerStubsMemory * > > allinnerstubs_
Definition: VMRouterCM.h:65
void resize(int nbins)
std::vector< VMStubsMEMemory * > vmstubsMEPHI_
Definition: VMRouterCM.h:68
constexpr unsigned int N_DSS_MOD
Definition: Settings.h:27
assert(be >=bs)
constexpr double VMROUTERCUTZL2
Definition: Settings.h:44
bool debugTracklet() const
Definition: Settings.h:182
static std::string const input
Definition: EdmProvDump.cc:47
std::string const & getName() const
Definition: ProcessBase.h:22
std::string const & getName() const
Definition: MemoryBase.h:19
std::vector< VMStubsTEPHICM > vmstubsTEPHI_
Definition: VMRouterCM.h:71
double nphireg(unsigned int inner, unsigned int iSeed) const
Definition: Settings.h:134
int value() const
Definition: FPGAWord.h:24
unsigned int overlapbits_
Definition: VMRouterCM.h:49
void setAllStubIndex(int nstub)
Definition: Stub.cc:123
unsigned int NLONGVMBINS() const
Definition: Settings.h:329
void addOutput(MemoryBase *memory, std::string output) override
Definition: VMRouterCM.cc:41
Divides< A, C > D1
Definition: Factorize.h:136
unsigned int nvmte(unsigned int inner, unsigned int iSeed) const
Definition: Settings.h:101
unsigned int bits(unsigned int lsb, unsigned int nbit) const
Definition: FPGAWord.cc:74
constexpr double VMROUTERCUTRD1D3
Definition: Settings.h:47
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
unsigned int nallstubs(unsigned int layerdisk) const
Definition: Settings.h:107
L1TStub * l1tstub()
Definition: Stub.h:77
unsigned int nextrabits_
Definition: VMRouterCM.h:50
unsigned int maxStep(std::string module) const
Definition: Settings.h:116
const FPGAWord & z() const
Definition: Stub.h:61
void initLayerDisk(unsigned int pos, int &layer, int &disk)
Definition: ProcessBase.cc:33
constexpr unsigned int NFINERZBITS
Definition: Settings.h:33
int lookup(unsigned int index) const
Definition: TrackletLUT.cc:900
int iseed
Definition: AMPTWrapper.h:134
void set(int value, int nbits, bool positive=true, int line=-1, const char *file=nullptr)
Definition: FPGAWord.cc:14
unsigned int nbitsallstubs(unsigned int layerdisk) const
Definition: Settings.h:106
FPGAWord iphivmFineBins(int VMbits, int finebits) const
Definition: Stub.cc:107
TrackletLUT meTable_
Definition: VMRouterCM.h:57
double kz() const
Definition: Settings.h:302
int nfinephi(unsigned int inner, unsigned int iSeed) const
Definition: Settings.h:133
const FPGAWord & r() const
Definition: Stub.h:60
double kr() const
Definition: Settings.h:304
void setAllStubIndex(unsigned int index)
Definition: L1TStub.h:81
unsigned int nbitsvmme(unsigned int layerdisk) const
Definition: Settings.h:103
void addInput(MemoryBase *memory, std::string input) override
Definition: VMRouterCM.cc:108
unsigned int layerdisk_
Definition: VMRouterCM.h:45
double lutwidthtab(unsigned int inner, unsigned int iSeed) const
Definition: Settings.h:140
tmp
align.sh
Definition: createJobs.py:716
std::vector< AllStubsMemory * > allstubs_
Definition: VMRouterCM.h:64
void resize(int nbins)
unsigned int nbitsvmte(unsigned int inner, unsigned int iSeed) const
Definition: Settings.h:95
constexpr unsigned int N_PHIBITS
Definition: Settings.h:36
tuple size
Write out results.
void initVMRTable(unsigned int layerdisk, VMRTableType type, int region=-1)
Definition: TrackletLUT.cc:490
constexpr unsigned int N_BITSMEMADDRESS
Definition: Settings.h:39
bool writetrace() const
Definition: Settings.h:183
constexpr unsigned int N_SEED_PROMPT
Definition: Settings.h:25
constexpr int N_LAYER
Definition: Settings.h:21