14 #define TRG_SHORT_NAMES
15 #define TRGCDC_SHORT_NAMES
19 #include "trg/trg/Debug.h"
20 #include "trg/trg/State.h"
21 #include "trg/trg/Channel.h"
22 #include "trg/trg/Utilities.h"
23 #include "trg/cdc/TRGCDC.h"
24 #include "trg/cdc/Cell.h"
25 #include "trg/cdc/Wire.h"
26 #include "trg/cdc/WireHit.h"
27 #include "trg/cdc/Segment.h"
28 #include "trg/cdc/SegmentHit.h"
29 #include "trg/cdc/TrackSegmentFinder.h"
30 #include "framework/datastore/StoreArray.h"
31 #include "framework/datastore/RelationArray.h"
32 #include "cdc/dataobjects/CDCSimHit.h"
33 #include "mdst/dataobjects/MCParticle.h"
34 #include "trg/cdc/FrontEnd.h"
35 #include "trg/cdc/Merger.h"
49 TRGCDCTrackSegmentFinder::TRGCDCTrackSegmentFinder(
const TRGCDC&
TRGCDC,
53 TRGBoard(
"",
TRGClock(
"", 0, 0),
TRGClock(
"", 0, 0),
TRGClock(
"", 0, 0),
56 m_logicLUTFlag(logicLUTFlag),
57 m_makeRootFile(makeRootFile),
58 _type(), _tosbE(), _tosbT()
69 TDirectory* currentDir = gDirectory;
71 m_fileTSF =
new TFile(
"TSF.root",
"RECREATE");
90 const std::string& name,
96 std::vector<TCSegment*>& tsSL)
97 :
TRGBoard(name, systemClock, dataClock, userClockInput, userClockOutput),
137 const bool trackSegmentClockSimulation,
138 std::vector<TRGCDCSegmentHit*>& segmentHits,
139 std::vector<TRGCDCSegmentHit*>* segmentHitsSL)
147 const unsigned n = tss.size();
148 for (
unsigned i = 0; i < n; i++) {
149 TCSegment& s = * tss[i];
152 if (s.signal().active()) {
153 TCSHit* th =
new TCSHit(s);
155 segmentHits.push_back(th);
156 segmentHitsSL[s.layerId()].push_back(th);
168 string dumpOption =
"trigger";
170 dumpOption =
"detail";
173 if (s.signal().active())
179 dumpOption =
"detail";
180 for (
unsigned i = 0; i < segmentHits.size(); i++) {
181 const TCSHit& s = * segmentHits[i];
187 dumpOption =
"detail";
189 for (
unsigned i = 0; i < segmentHitsSL[j].size(); i++) {
190 const vector<TCSHit*>& s = segmentHitsSL[j];
191 for (
unsigned k = 0; k < s.size(); k++)
211 for (
unsigned i = 0; i <
_tosbE->size(); i++)
216 for (
unsigned i = 0; i <
_tosbT->size(); i++)
230 vector <TRGSignalVector*> inputM;
231 vector <TRGSignalVector*> findOUTTrack;
232 vector <TRGSignalVector*> findOUTEvt;
233 vector <int> tmpCTimeListE;
234 vector <int> changeTimeListE;
235 vector <int> tmpCTimeListT;
236 vector <int> changeTimeListT;
237 inputM.resize((*this).size());
239 for (
unsigned i = 0; i <
nInput(); i++) {
246 for (
unsigned i = 0; i < inputM[0]->size(); i++) {
252 vector<TRGSignalVector*> separateTS;
254 for (
int i = 0; i < 8; i++)
255 clockCounter->push_back(inputv[236 + i]);
256 separateTS.resize(16);
258 int nTS = separateTS.size();
259 findOUTTrack.resize(nTS);
260 findOUTEvt.resize(nTS);
261 if (
type() == outerType) {
262 for (
int i = 0; i < nTS; i++) {
266 separateTS[i]->push_back(inputv[255]);
268 separateTS[i]->push_back(inputv[i - 1]);
269 separateTS[i]->push_back(inputv[i]);
271 separateTS[i]->push_back(inputv[255]);
273 separateTS[i]->push_back(inputv[i + 1]);
275 separateTS[i]->push_back(inputv[255]);
277 separateTS[i]->push_back(inputv[i + 15]);
278 separateTS[i]->push_back(inputv[i + 16]);
279 separateTS[i]->push_back(inputv[i + 32]);
281 separateTS[i]->push_back(inputv[255]);
283 separateTS[i]->push_back(inputv[i + 47]);
284 separateTS[i]->push_back(inputv[i + 48]);
286 separateTS[i]->push_back(inputv[255]);
288 separateTS[i]->push_back(inputv[i + 63]);
289 separateTS[i]->push_back(inputv[i + 64]);
291 separateTS[i]->push_back(inputv[255]);
293 separateTS[i]->push_back(inputv[i + 65]);
296 separateTS[i]->push_back(inputv[4 * i + 80]);
297 separateTS[i]->push_back(inputv[4 * i + 81]);
298 separateTS[i]->push_back(inputv[4 * i + 82]);
299 separateTS[i]->push_back(inputv[4 * i + 83]);
301 separateTS[i]->push_back(inputv[4 * i + 144]);
302 separateTS[i]->push_back(inputv[4 * i + 145]);
303 separateTS[i]->push_back(inputv[4 * i + 146]);
304 separateTS[i]->push_back(inputv[4 * i + 147]);
308 separateTS[i]->push_back(cc[0]);
309 separateTS[i]->push_back(cc[1]);
310 separateTS[i]->push_back(cc[2]);
311 separateTS[i]->push_back(cc[3]);
312 separateTS[i]->push_back(cc[4]);
316 for (
int i = 0; i < nTS; i++) {
317 findOUTTrack[i] =
findTSHit(separateTS[i], i)[0];
318 vector<int> tt = findOUTTrack[i]->stateChanges();
320 tmpCTimeListT.insert(tmpCTimeListT.end(), tt.begin(), tt.end());
322 findOUTEvt[i] =
findTSHit(separateTS[i], i)[1];
323 vector<int> ee = findOUTEvt[i]->stateChanges();
325 tmpCTimeListE.insert(tmpCTimeListE.end(), ee.begin(), ee.end());
332 for (
unsigned i = 0; i < tmpCTimeListT.size(); i++) {
334 for (
unsigned j = 0; j < changeTimeListT.size(); j++) {
335 if (tmpCTimeListT[i] == changeTimeListT[j]) {
340 if (nomatch) changeTimeListT.push_back(tmpCTimeListT[i]);
345 (*trackerOut).insert((*trackerOut).end(), (*clockCounter).begin(),
346 (*clockCounter).end());
347 trackerOut->
name(
"TSF TrackerOut");
349 const string noT =
name() +
"OutputSignalBundleTracker";
351 _tosbT->push_back(trackerOut);
353 (*_tosbT)[0]->
name(noT);
354 for (
unsigned i = 0; i < (*(*_tosbT)[0]).size(); i++)
359 for (
unsigned i = 0; i < tmpCTimeListE.size(); i++) {
361 for (
unsigned j = 0; j < changeTimeListE.size(); j++) {
362 if (tmpCTimeListE[i] == changeTimeListE[j]) {
367 if (nomatch) changeTimeListE.push_back(tmpCTimeListE[i]);
371 (*evtOut).insert((*evtOut).end(), (*clockCounter).begin(),
372 (*clockCounter).end());
374 const string noE =
name() +
"OutputSignalBundleEvt";
376 _tosbE->push_back(evtOut);
378 (*_tosbE)[0]->
name(noE);
379 for (
unsigned i = 0; i < (*(*_tosbE)[0]).size(); i++)
388 vector <TRGSignalVector*>
394 tsid) +
" in " + name();
395 TCSegment* tsi = _tsSL[tsid];
396 vector <TRGSignalVector*> result;
399 vector<bool> fTimeVect;
403 vector <bool> tmpOutBool;
408 eachInput->
clock(), 0);
411 for (
unsigned i = 0; i < 12; i++) {
412 Hitmap->push_back((*eachInput)[i]);
413 (*Hitmap)[i].widen(16);
415 for (
unsigned i = 0; i < 4; i++) {
416 pTime.push_back((*eachInput)[i + 12]);
417 fTime.push_back((*eachInput)[i + 16]);
419 for (
unsigned i = 0; i < 5; i++) {
420 pTime.push_back((*eachInput)[i + 20]);
421 fTime.push_back((*eachInput)[i + 20]);
426 int* LUTValue =
new int[changeTime.size()];
427 if (changeTime.size()) {
433 fTime.state(changeTime[0]).copy2bool(fTimeBool);
435 fTimeVect.insert(fTimeVect.begin(), fTimeBool, fTimeBool + 10);
438 for (
unsigned i = 0; i < changeTime.size(); i++) {
439 LUTValue[i] = tsi->LUT()->getValue(mkint(Hitmap->
state(changeTime[i])));
442 if ((LUTValue[i]) && (eOUT)) {
443 resultE->
set(fTimeVect, changeTime[i]);
447 bool priority1rise = (*Hitmap)[6].riseEdge(changeTime[i]);
448 bool priority2rise = ((*Hitmap)[7].riseEdge(changeTime[i]) |
449 (*Hitmap)[8].riseEdge(changeTime[i]));
455 tmpPTime = mkint(pTime.state(changeTime[i]));
456 tmpCTime = changeTime[i];
457 }
else if (priority2rise) {
459 tmpPTime = mkint(pTime.state(changeTime[i]));
460 tmpCTime = changeTime[i];
461 if ((*Hitmap)[0].state(changeTime[i])) hitPosition = 2;
462 else hitPosition = 1;
467 if ((hitPosition) && (LUTValue[i]) && ((changeTime[i] - tmpCTime) < 16)) {
468 tmpOutInt = tsid * pow(2, 13) + tmpPTime * pow(2, 4) + LUTValue[i] * pow(2,
470 tmpOutBool = mkbool(tmpOutInt, 22);
471 if (hitPosition == 3) {
472 if (priority1rise) resultT->
set(tmpOutBool, changeTime[i]);
474 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
475 if (!((LUTValue[i - 1] == 1) |
476 (LUTValue[i - 1] == 2)))
477 resultT->
set(tmpOutBool, changeTime[i]);
479 if (!(LUTValue[i - 1])) resultT->
set(tmpOutBool, changeTime[i]);
483 if (priority2rise) resultT->
set(tmpOutBool, changeTime[i]);
485 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
486 if (!((LUTValue[i - 1] == 1) |
487 (LUTValue[i - 1] == 2)))
488 resultT->
set(tmpOutBool, changeTime[i]);
490 if (!(LUTValue[i])) resultT->
set(tmpOutBool, changeTime[i]);
499 result.push_back(resultT);
500 result.push_back(resultE);
509 TSFinder::packerOuterTracker(vector<TRGSignalVector*>& hitList,
511 const unsigned maxHit)
513 TRGSignalVector* result =
514 new TRGSignalVector(
"", (* hitList[0]).clock() , 21 * maxHit);
516 for (
unsigned ci = 0; ci < cList.size(); ci++) {
518 for (
unsigned hi = 0; hi < hitList.size(); hi++) {
519 TRGState s = (* hitList[hi]).state(cList[ci]);
521 if (cntHit >= maxHit)
continue;
522 for (
unsigned j = 0; j < 21; j++) {
523 if ((* hitList[hi])[j].state(cList[ci])) {
524 (* result)[21 * (maxHit - 1) - (cntHit * 21) + j]
525 .set(cList[ci], cList[ci] + 1);
529 TRGState t = hitList[hi]->state(cList[ci]).subset(13, 9);
531 << unsigned(t) <<
"(" << t <<
")" << endl;
544 TSFinder::packerOuterEvt(vector<TRGSignalVector*> hitList, vector<int> cList,
549 TRGSignalVector* result =
new TRGSignalVector(
"", (*hitList[0]).clock() ,
550 hitList.size() + 9 * maxHit);
552 for (
unsigned ci = 0; ci < cList.size(); ci++) {
554 for (
unsigned hi = 0; hi < hitList.size(); hi++) {
555 if ((*hitList[hi]).state(cList[ci]).active()) {
556 (*result)[9 * maxHit + hi].set(cList[ci], cList[ci] + 1);
557 if (cntHit >= maxHit)
continue;
558 for (
unsigned j = 0; j < (((*hitList[hi])).size() - 1); j++) {
559 if ((*hitList[hi])[j].state(cList[ci]))
560 (*result)[9 * (maxHit - 1) - (cntHit * 9) + j].set(cList[ci], cList[ci] + 1);
570 TSFinder::mkint(TRGState bitInput)
573 bool* binput =
new bool[bitInput.size()];
574 bitInput.copy2bool(binput);
575 for (
unsigned i = 0; i < bitInput.size(); i++) {
584 TSFinder::mkbool(
int N,
int bitSize)
586 vector<bool> boutput;
587 boutput.resize(bitSize);
589 for (
unsigned i = 0; tmpint; i++) {
590 if (tmpint % 2) boutput[i] =
true;
591 else boutput[i] =
false;
605 hitPatternInformation.Clear();
620 const unsigned nTSs = tss.size();
621 unsigned nHitTSs = 0;
622 for (
unsigned iTS = 0; iTS < nTSs; iTS++) {
623 const TCSegment& ts = * tss[iTS];
628 if (ts.wires().size() == 15) {
629 priority = ts.wires()[0];
630 secondPriorityR = ts.wires()[1];
631 secondPriorityL = ts.wires()[2];
633 priority = ts.wires()[5];
634 secondPriorityR = ts.wires()[6];
635 secondPriorityL = ts.wires()[7];
638 vector<int> priorityLRs(3);
639 vector<float> priorityPhis(3);
642 if (priority->
hit() != 0) {
644 priorityLRs[0] = SimHits[iSimHit]->getPosFlag();
645 posOnTrack = SimHits[iSimHit]->getPosTrack();
646 posOnWire = SimHits[iSimHit]->getPosWire();
647 priorityPhis[0] = (posOnTrack - posOnWire).Phi() +
m_Trg_PI / 2 -
656 priorityPhis[0] = 9999;
658 if (secondPriorityR->
hit() != 0) {
660 priorityLRs[1] = SimHits[iSimHit]->getPosFlag();
661 posOnTrack = SimHits[iSimHit]->getPosTrack();
662 posOnWire = SimHits[iSimHit]->getPosWire();
663 priorityPhis[1] = (posOnTrack - posOnWire).Phi() +
m_Trg_PI / 2 -
667 priorityPhis[1] = 9999;
669 if (secondPriorityL->
hit() != 0) {
671 priorityLRs[2] = SimHits[iSimHit]->getPosFlag();
672 posOnTrack = SimHits[iSimHit]->getPosTrack();
673 posOnWire = SimHits[iSimHit]->getPosWire();
674 priorityPhis[2] = (posOnTrack - posOnWire).Phi() +
m_Trg_PI / 2 -
678 priorityPhis[2] = 9999;
681 const unsigned nWires = ts.wires().size();
682 unsigned nHitWires = 0;
684 map<int, unsigned> particleTSPattern;
686 for (
unsigned iWire = 0; iWire < nWires; iWire++) {
688 const TRGSignal& wireSignal = ts.wires()[iWire]->signal();
689 if (wireSignal.
active()) ++nHitWires;
694 int iMCParticle = (particle) ? particle->getArrayIndex() : mcParticles.
getEntries();
696 if (particleTSPattern[iMCParticle] == 0) {
697 particleTSPattern[iMCParticle] = 1 << iWire;
699 particleTSPattern[iMCParticle] |= 1 << iWire;
710 if (nHitWires != 0) {
712 if (particleTSPattern.size() == 1) {
713 map<int, unsigned>::const_iterator it = particleTSPattern.begin();
714 bitset<15> printPattern((*it).second);
718 TVectorD tsPatternInformation(9);
719 tsPatternInformation[0] = (*it).first;
720 tsPatternInformation[1] = ts.superLayerId();
721 tsPatternInformation[2] = double((*it).second);
722 tsPatternInformation[3] = priorityLRs[0];
723 tsPatternInformation[4] = priorityPhis[0];
724 tsPatternInformation[5] = priorityLRs[1];
725 tsPatternInformation[6] = priorityPhis[1];
726 tsPatternInformation[7] = priorityLRs[2];
727 tsPatternInformation[8] = priorityPhis[2];
728 new(hitPatternInformation[nHitTSs++]) TVectorD(tsPatternInformation);
745 particleEfficiency.Clear();
746 tsInformation.Clear();
748 int mcInformation = 1;
763 map<int, int> simHitsMCParticlesMap;
765 for (
int iPart = 0; iPart < cdcSimHitRel.
getEntries(); iPart++) {
767 for (
unsigned iHit = 0; iHit < cdcSimHitRel[iPart].getToIndices().size();
770 simHitsMCParticlesMap[cdcSimHitRel[iPart].getToIndex(iHit)] =
771 cdcSimHitRel[iPart].getFromIndex();
781 map<int, unsigned> particleNHitTS;
783 for (
int iSuperLayer = 0; iSuperLayer < 9; iSuperLayer++) {
785 for (
unsigned iTS = 0; iTS < segmentHitsSL[iSuperLayer].size(); iTS++) {
786 const TCSegment& ts = segmentHitsSL[iSuperLayer][iTS]->segment();
787 unsigned nWires = ts.wires().size();
788 for (
unsigned iWire = 0; iWire < nWires; iWire++) {
791 int iMCParticle = simHitsMCParticlesMap[wireHit->
iCDCSimHit()];
792 if (particleNHitTS[iMCParticle] == 0) {
794 hitTSSL = 1 << iSuperLayer;
795 particleNHitTS[iMCParticle] = hitTSSL;
797 particleNHitTS[iMCParticle] |= 1 << iSuperLayer;
812 vector<vector<float>> tsEfficiency;
814 for (
int iPart = 0; iPart < cdcSimHitRel.
getEntries(); iPart++) {
815 int lastWireHit = -1;
817 for (
unsigned iHit = 0; iHit < cdcSimHitRel[iPart].getToIndices().size();
819 int iSimHit = cdcSimHitRel[iPart].getToIndex(iHit);
820 if (SimHits[iSimHit]->getWireID().getICLayer() > lastWireHit) lastWireHit =
821 SimHits[iSimHit]->getWireID().getICLayer();
828 if (lastWireHit >= 53) lastSLHit = 9;
829 else if (lastWireHit >= 47) lastSLHit = 8;
830 else if (lastWireHit >= 41) lastSLHit = 7;
831 else if (lastWireHit >= 35) lastSLHit = 6;
832 else if (lastWireHit >= 29) lastSLHit = 5;
833 else if (lastWireHit >= 23) lastSLHit = 4;
834 else if (lastWireHit >= 17) lastSLHit = 3;
835 else if (lastWireHit >= 11) lastSLHit = 2;
836 else if (lastWireHit >= 5) lastSLHit = 1;
838 int iMCParticle = cdcSimHitRel[iPart].getFromIndex();
839 bitset<9> hitSuperLayers(particleNHitTS[iMCParticle]);
840 int numberHitSuperLayers = hitSuperLayers.count();
842 float mcPt = mcParticles[iMCParticle]->getMomentum().Perp();
844 if (lastSLHit == 0) efficiency = -1;
845 else efficiency = float(numberHitSuperLayers) / lastSLHit;
847 vector<float> tempEfficiency;
848 tempEfficiency.resize(3);
849 tempEfficiency[0] = efficiency;
850 tempEfficiency[1] = mcPt;
851 tempEfficiency[2] = lastSLHit;
852 tsEfficiency.push_back(tempEfficiency);
860 for (
unsigned iEfficiency = 0; iEfficiency < tsEfficiency.size();
862 TVectorD t_particleEfficiency(3);
863 t_particleEfficiency[0] = tsEfficiency[iEfficiency][0];
864 t_particleEfficiency[1] = tsEfficiency[iEfficiency][1];
865 t_particleEfficiency[2] = tsEfficiency[iEfficiency][2];
866 new(particleEfficiency[iEfficiency]) TVectorD(t_particleEfficiency);
875 for (
int iSuperLayer = 0; iSuperLayer < 9; iSuperLayer++) {
876 for (
unsigned iTS = 0; iTS < segmentHitsSL[iSuperLayer].size(); iTS++) {
877 const TCSegment& ts = segmentHitsSL[iSuperLayer][iTS]->segment();
880 if (iSuperLayer == 0) iWire = 0;
884 unsigned nHits = ts.wires()[iWire]->signal().nSignals();
885 for (
unsigned iHit = 0; iHit < nHits; iHit++) {
886 if (iHit % 2 == 1)
continue;
887 TVectorD tempTSInformation(3);
888 tempTSInformation[0] = iSuperLayer;
889 tempTSInformation[1] = ts.localId();
890 tempTSInformation[2] = ts.wires()[iWire]->signal().stateChanges()[iHit];
891 new(tsInformation[iHitTS++]) TVectorD(tempTSInformation);
907 std::vector<TRGCDCSegment*>& tss)
917 nnPatternInformation.Clear();
921 const unsigned nTSs = tss.size();
922 unsigned indexSaving = 0;
923 for (
unsigned iTS = 0; iTS < nTSs; iTS++) {
925 const TCSegment& ts = * tss[iTS];
926 const TCSHit* tsHit = ts.hit();
929 if (ts.wires().size() == 15) priority = ts.wires()[0];
930 else priority = ts.wires()[5];
932 if (priority->
hit()) {
936 vector<float> wireTime;
937 if (ts.superLayerId() == 0)
943 const unsigned nWires = ts.wires().size();
944 for (
unsigned iWire = 0; iWire < nWires; iWire++) {
953 wireTime[iWire] = 9999;
963 int lastLayer = ts.wires().back()->layerId();
964 int lastWire = ts.wires().back()->localId();
967 for (
unsigned iWire = 0; iWire < 6; iWire++) {
968 int wireIndex = lastWire - 4 + iWire;
969 if (wireIndex < 0) wireIndex += nWiresLayer;
970 if (wireIndex >= nWiresLayer) wireIndex -= nWiresLayer;
980 wireTime.push_back(9999);
983 for (
unsigned iWire = 0; iWire < 5; iWire++) {
984 int wireIndex = lastWire - 3 + iWire;
985 if (wireIndex < 0) wireIndex += nWiresLayer;
986 if (wireIndex >= nWiresLayer) wireIndex -= nWiresLayer;
996 wireTime.push_back(9999);
1020 if (priority->
hit()->
mcLR()) mcLRDriftTime *= -1;
1024 TVectorD t_nnPatternInformation;
1025 if (ts.superLayerId() == 0) {
1027 t_nnPatternInformation.ResizeTo(23);
1028 t_nnPatternInformation[0] = ts.superLayerId();
1029 t_nnPatternInformation[1] = mcLRDriftTime;
1031 for (
unsigned iWire = 0; iWire < 21; iWire++)
1032 t_nnPatternInformation[iWire + 2] = wireTime[iWire];
1033 new(nnPatternInformation[indexSaving++]) TVectorD(t_nnPatternInformation);
1036 t_nnPatternInformation.ResizeTo(17);
1037 t_nnPatternInformation[0] = ts.superLayerId();
1038 t_nnPatternInformation[1] = mcLRDriftTime;
1040 for (
unsigned iWire = 0; iWire < 15; iWire++)
1041 t_nnPatternInformation[iWire + 2] = wireTime[iWire];
1042 new(nnPatternInformation[indexSaving++]) TVectorD(t_nnPatternInformation);
1056 std::vector<const TRGCDCMerger*>::push_back(a);
1064 const string sn =
"TSF::simulateOuter : " +
name();
1068 for (
unsigned m = 0; m <
nInput(); m++) {
1071 for (
unsigned i = 0; i < 16; i++) {
1072 _secMap.push_back(& ((* b)[0][0][208 + i]));
1073 for (
unsigned j = 0; j < 5; j++)
1075 for (
unsigned j = 0; j < 4; j++)
1076 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
1077 for (
unsigned j = 0; j < 4; j++)
1078 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
1081 for (
unsigned i = 0; i < 4; i++)
1082 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
1083 for (
unsigned i = 0; i < 4; i++)
1084 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
1085 for (
unsigned i = 0; i < 4; i++)
1086 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
1090 const unsigned nTSF =
nInput() * 16;
1091 vector<TRGSignalVector*> trker[4];
1092 vector<int> tsfStateChanges;
1095 for (
unsigned t = 0; t < nTSF; t++) {
1104 s->push_back(* (
_hitMap[0][nTSF - 1]));
1105 s->push_back(* (
_hitMap[0][0]));
1106 s->push_back(* (
_hitMap[0][1]));
1107 s->push_back(* (
_hitMap[1][nTSF - 1]));
1108 s->push_back(* (
_hitMap[1][0]));
1109 s->push_back(* (
_hitMap[2][0]));
1110 s->push_back(* (
_hitMap[3][nTSF - 1]));
1111 s->push_back(* (
_hitMap[3][0]));
1112 s->push_back(* (
_hitMap[4][nTSF - 1]));
1113 s->push_back(* (
_hitMap[4][0]));
1114 s->push_back(* (
_hitMap[4][1]));
1115 }
else if (t == (nTSF - 1)) {
1116 s->push_back(* (
_hitMap[0][nTSF - 2]));
1117 s->push_back(* (
_hitMap[0][nTSF - 1]));
1118 s->push_back(* (
_hitMap[0][0]));
1119 s->push_back(* (
_hitMap[1][nTSF - 2]));
1120 s->push_back(* (
_hitMap[1][nTSF - 1]));
1121 s->push_back(* (
_hitMap[2][nTSF - 1]));
1122 s->push_back(* (
_hitMap[3][nTSF - 2]));
1123 s->push_back(* (
_hitMap[3][nTSF - 1]));
1125 s->push_back(* (
_hitMap[4][nTSF - 2]));
1126 s->push_back(* (
_hitMap[4][nTSF - 1]));
1127 s->push_back(* (
_hitMap[4][0]));
1129 s->push_back(* (
_hitMap[0][t - 1]));
1130 s->push_back(* (
_hitMap[0][t]));
1131 s->push_back(* (
_hitMap[0][t + 1]));
1132 s->push_back(* (
_hitMap[1][t - 1]));
1133 s->push_back(* (
_hitMap[1][t]));
1134 s->push_back(* (
_hitMap[2][t]));
1135 s->push_back(* (
_hitMap[3][t - 1]));
1136 s->push_back(* (
_hitMap[3][t]));
1137 s->push_back(* (
_hitMap[4][t - 1]));
1138 s->push_back(* (
_hitMap[4][t]));
1139 s->push_back(* (
_hitMap[4][t + 1]));
1143 s->push_back(*
_priMap[t * 4 + 0]);
1144 s->push_back(*
_priMap[t * 4 + 1]);
1145 s->push_back(*
_priMap[t * 4 + 2]);
1146 s->push_back(*
_priMap[t * 4 + 3]);
1163 _tsfOut.push_back(forTracker0);
1164 _tsfOut.push_back(forTracker1);
1169 for (
unsigned i = 0; i < sc.size(); i++) {
1171 for (
unsigned j = 0; j < tsfStateChanges.size(); j++) {
1172 if (tsfStateChanges[j] == sc[i]) {
1177 if (! skip) tsfStateChanges.push_back(sc[i]);
1181 const unsigned pos = t / (nTSF / 4);
1183 addID(* forTracker0, t + (nTSF / 4));
1184 addID(* forTracker1, t);
1185 trker[3].push_back(forTracker0);
1186 trker[0].push_back(forTracker1);
1187 }
else if (pos == 1) {
1188 addID(* forTracker0, t);
1189 addID(* forTracker1, t - 1 * (nTSF / 4));
1190 trker[0].push_back(forTracker0);
1191 trker[1].push_back(forTracker1);
1192 }
else if (pos == 2) {
1193 addID(* forTracker0, t - 1 * (nTSF / 4));
1194 addID(* forTracker1, t - 2 * (nTSF / 4));
1195 trker[1].push_back(forTracker0);
1196 trker[2].push_back(forTracker1);
1198 addID(* forTracker0, t - 2 * (nTSF / 4));
1199 addID(* forTracker1, t - 3 * (nTSF / 4));
1200 trker[2].push_back(forTracker0);
1201 trker[3].push_back(forTracker1);
1205 if (forTracker0->
active())
1211 std::sort(tsfStateChanges.begin(), tsfStateChanges.end());
1214 for (
unsigned i = 0; i < 4; i++) {
1236 vector <TRGSignalVector*>
1243 TCSegment* tsi = _tsSL[tsid];
1244 vector <TRGSignalVector*> result;
1247 vector<bool> fTimeVect;
1251 vector <bool> tmpOutBool;
1259 for (
unsigned i = 0; i < 12; i++) {
1260 Hitmap->push_back((*in)[i]);
1261 (*Hitmap)[i].widen(16);
1263 for (
unsigned i = 0; i < 4; i++) {
1264 pTime.push_back((*in)[i + 12]);
1265 fTime.push_back((*in)[i + 16]);
1270 for (
unsigned i = 0; i < 5; i++) {
1271 pTime.push_back(cc[i]);
1272 fTime.push_back(cc[i]);
1277 int* LUTValue =
new int[changeTime.size()];
1278 if (changeTime.size()) {
1279 int hitPosition = 0;
1284 fTime.state(changeTime[0]).copy2bool(fTimeBool);
1285 fTimeBool[9] =
true;
1286 fTimeVect.insert(fTimeVect.begin(), fTimeBool, fTimeBool + 10);
1289 for (
unsigned i = 0; i < changeTime.size(); i++) {
1290 LUTValue[i] = tsi->LUT()->getValue(mkint(Hitmap->
state(changeTime[i])));
1293 if ((LUTValue[i]) && (eOUT)) {
1294 resultE->
set(fTimeVect, changeTime[i]);
1298 bool priority1rise = (*Hitmap)[6].riseEdge(changeTime[i]);
1299 bool priority2rise = ((*Hitmap)[7].riseEdge(changeTime[i]) |
1300 (*Hitmap)[8].riseEdge(changeTime[i]));
1304 if (priority1rise) {
1306 tmpPTime = mkint(pTime.state(changeTime[i]));
1307 tmpCTime = changeTime[i];
1308 }
else if (priority2rise) {
1310 tmpPTime = mkint(pTime.state(changeTime[i]));
1311 tmpCTime = changeTime[i];
1312 if ((*Hitmap)[0].state(changeTime[i])) hitPosition = 2;
1313 else hitPosition = 1;
1318 if ((hitPosition) && (LUTValue[i]) && ((changeTime[i] - tmpCTime) < 16)) {
1321 tmpOutInt = tmpPTime * pow(2, 4) +
1322 LUTValue[i] * pow(2, 2) + hitPosition;
1323 tmpOutBool = mkbool(tmpOutInt, 13);
1324 if (hitPosition == 3) {
1325 if (priority1rise) resultT->
set(tmpOutBool, changeTime[i]);
1327 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
1328 if (!((LUTValue[i - 1] == 1) |
1329 (LUTValue[i - 1] == 2)))
1330 resultT->
set(tmpOutBool, changeTime[i]);
1332 if (!(LUTValue[i - 1])) resultT->
set(tmpOutBool, changeTime[i]);
1336 if (priority2rise) resultT->
set(tmpOutBool, changeTime[i]);
1338 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
1339 if (!((LUTValue[i - 1] == 1) |
1340 (LUTValue[i - 1] == 2)))
1341 resultT->
set(tmpOutBool, changeTime[i]);
1343 if (!(LUTValue[i])) resultT->
set(tmpOutBool, changeTime[i]);
1352 result.push_back(resultT);
1353 result.push_back(resultE);
1363 const unsigned nTSF,
1370 unsigned rem = t % 16;
1373 s.push_back(*
_priMap[t * 4 + 0]);
1374 s.push_back(*
_priMap[t * 4 + 1]);
1375 s.push_back(*
_priMap[t * 4 + 2]);
1376 s.push_back(*
_priMap[t * 4 + 3]);
1382 tc.push_back(center);
1383 tc.push_back(right);
1388 s.push_back(*
_priMap[t * 4 + 0]);
1389 s.push_back(*
_priMap[t * 4 + 1]);
1390 s.push_back(*
_priMap[t * 4 + 2]);
1391 s.push_back(*
_priMap[t * 4 + 3]);
1395 const string sn =
"TSF priority timing outer";
1400 t0.push_back(*
_priMap[t * 4 + 0]);
1401 t0.push_back(*
_priMap[t * 4 + 1]);
1402 t0.push_back(*
_priMap[t * 4 + 2]);
1403 t0.push_back(*
_priMap[t * 4 + 3]);
1406 unsigned p = t / 16;
1410 t1.push_back(*
_edg0Map[p * 4 + 0]);
1411 t1.push_back(*
_edg0Map[p * 4 + 1]);
1412 t1.push_back(*
_edg0Map[p * 4 + 2]);
1413 t1.push_back(*
_edg0Map[p * 4 + 3]);
1416 vector<TRGState*> outputTimingStates;
1417 vector<int> clkStates;
1420 for (
unsigned i = 0; i < sc.size(); i++) {
1428 else if (stt[1] && (! stt[2]))
1430 else if ((! stt[1]) && stt[2])
1433 if (
unsigned(t0.state(clk)) <
unsigned(t1.state(clk)))
1440 outputTimingStates.push_back(
new TRGState(t0.state(clk)));
1441 sb.push_back(
false);
1443 outputTimingStates.push_back(
new TRGState(t1.state(clk)));
1446 clkStates.push_back(clk);
1450 const unsigned n = outputTimingStates.size();
1452 for (
unsigned i = 0; i < n; i++) {
1454 s[0].unset(clkStates[i], clkStates[i] + 1);
1455 st.set(* outputTimingStates[i], clkStates[i]);
1456 delete outputTimingStates[i];
1478 const unsigned nTSF,
1482 const unsigned rem = t % 16;
1484 if ((rem != 0) && (rem != 15)) {
1485 s.push_back(*
_fasMap[t * 4 + 0]);
1486 s.push_back(*
_fasMap[t * 4 + 1]);
1487 s.push_back(*
_fasMap[t * 4 + 2]);
1488 s.push_back(*
_fasMap[t * 4 + 3]);
1494 for (
unsigned i = 0; i < 11; i++) {
1495 if (s[i + 1].active()) {
1503 s.push_back(*
_fasMap[t * 4 + 0]);
1504 s.push_back(*
_fasMap[t * 4 + 1]);
1505 s.push_back(*
_fasMap[t * 4 + 2]);
1506 s.push_back(*
_fasMap[t * 4 + 3]);
1510 const string sn =
"TSF fastest timing outer";
1515 t0.push_back(*
_fasMap[t * 4 + 0]);
1516 t0.push_back(*
_fasMap[t * 4 + 1]);
1517 t0.push_back(*
_fasMap[t * 4 + 2]);
1518 t0.push_back(*
_fasMap[t * 4 + 3]);
1524 unsigned n = t / 16;
1530 t1.push_back(*
_edg2Map[n * 4 + 0]);
1531 t1.push_back(*
_edg2Map[n * 4 + 1]);
1532 t1.push_back(*
_edg2Map[n * 4 + 2]);
1533 t1.push_back(*
_edg2Map[n * 4 + 3]);
1548 unsigned n = t / 16 + 1;
1552 t1.push_back(*
_edg1Map[n * 4 + 0]);
1553 t1.push_back(*
_edg1Map[n * 4 + 1]);
1554 t1.push_back(*
_edg1Map[n * 4 + 2]);
1555 t1.push_back(*
_edg1Map[n * 4 + 3]);
1572 vector<int> sc = t0.stateChanges();
1573 vector<int> tmp = t1.stateChanges();
1574 sc.insert(sc.end(), tmp.begin(), tmp.end());
1575 std::sort(sc.begin(), sc.end());
1580 for (
unsigned i = 0; i < sc.size(); i++) {
1588 unsigned tm0 = unsigned(ts0);
1589 unsigned tm1 = unsigned(ts1);
1590 bool th0 = ht0.
state(clk);
1591 bool th1 = ht1.
state(clk);
1593 if ((! th0) && (! th1))
1595 else if (th0 && th1) {
1632 const string sn =
"TSF::simulateInner : " +
name();
1636 for (
unsigned i = 0; i < 4; i++) {
1640 b->push_back(dummy);
1655 for (
unsigned m = 0; m <
nInput(); m++) {
1658 for (
unsigned i = 0; i < 16; i++) {
1659 _secMap.push_back(& ((* b)[0][0][208 + i]));
1660 for (
unsigned j = 0; j < 5; j++)
1662 for (
unsigned j = 0; j < 4; j++)
1663 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
1664 for (
unsigned j = 0; j < 4; j++)
1665 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
1668 for (
unsigned i = 0; i < 4; i++)
1669 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
1670 for (
unsigned i = 0; i < 4; i++)
1671 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
1672 for (
unsigned i = 0; i < 4; i++)
1673 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
1674 for (
unsigned i = 0; i < 4; i++)
1675 _edg3Map.push_back(& ((* b)[0][0][224 + 12 + i]));
1676 for (
unsigned i = 0; i < 4; i++)
1677 _edg4Map.push_back(& ((* b)[0][0][224 + 16 + i]));
1681 const unsigned nTSF =
nInput() * 16;
1682 vector<TRGSignalVector*> trker[4];
1683 vector<int> tsfStateChanges;
1686 for (
unsigned t = 0; t < nTSF; t++) {
1695 s->push_back(* (
_hitMap[0][0]));
1696 s->push_back(* (
_hitMap[1][nTSF - 1]));
1697 s->push_back(* (
_hitMap[1][0]));
1698 s->push_back(* (
_hitMap[2][nTSF - 1]));
1699 s->push_back(* (
_hitMap[2][0]));
1700 s->push_back(* (
_hitMap[2][1]));
1701 s->push_back(* (
_hitMap[3][nTSF - 2]));
1702 s->push_back(* (
_hitMap[3][nTSF - 1]));
1703 s->push_back(* (
_hitMap[3][0]));
1704 s->push_back(* (
_hitMap[3][1]));
1705 s->push_back(* (
_hitMap[4][nTSF - 2]));
1706 s->push_back(* (
_hitMap[4][nTSF - 1]));
1707 s->push_back(* (
_hitMap[4][0]));
1708 s->push_back(* (
_hitMap[4][1]));
1709 s->push_back(* (
_hitMap[4][2]));
1710 }
else if (t == 1) {
1711 s->push_back(* (
_hitMap[0][1]));
1712 s->push_back(* (
_hitMap[1][0]));
1713 s->push_back(* (
_hitMap[1][1]));
1714 s->push_back(* (
_hitMap[2][0]));
1715 s->push_back(* (
_hitMap[2][1]));
1716 s->push_back(* (
_hitMap[2][2]));
1717 s->push_back(* (
_hitMap[3][nTSF - 1]));
1718 s->push_back(* (
_hitMap[3][0]));
1719 s->push_back(* (
_hitMap[3][1]));
1720 s->push_back(* (
_hitMap[3][2]));
1721 s->push_back(* (
_hitMap[4][nTSF - 1]));
1722 s->push_back(* (
_hitMap[4][0]));
1723 s->push_back(* (
_hitMap[4][1]));
1724 s->push_back(* (
_hitMap[4][2]));
1725 s->push_back(* (
_hitMap[4][3]));
1726 }
else if (t == (nTSF - 2)) {
1727 s->push_back(* (
_hitMap[0][t]));
1728 s->push_back(* (
_hitMap[1][t - 11]));
1729 s->push_back(* (
_hitMap[1][t]));
1730 s->push_back(* (
_hitMap[2][t - 1]));
1731 s->push_back(* (
_hitMap[2][t]));
1732 s->push_back(* (
_hitMap[2][0]));
1733 s->push_back(* (
_hitMap[3][t - 2]));
1734 s->push_back(* (
_hitMap[3][t - 1]));
1735 s->push_back(* (
_hitMap[3][t]));
1736 s->push_back(* (
_hitMap[3][0]));
1737 s->push_back(* (
_hitMap[4][t - 2]));
1738 s->push_back(* (
_hitMap[4][t - 1]));
1739 s->push_back(* (
_hitMap[4][t]));
1740 s->push_back(* (
_hitMap[4][t + 1]));
1741 s->push_back(* (
_hitMap[4][0]));
1742 }
else if (t == (nTSF - 1)) {
1743 s->push_back(* (
_hitMap[0][t]));
1744 s->push_back(* (
_hitMap[1][t - 11]));
1745 s->push_back(* (
_hitMap[1][t]));
1746 s->push_back(* (
_hitMap[2][t - 1]));
1747 s->push_back(* (
_hitMap[2][t]));
1748 s->push_back(* (
_hitMap[2][0]));
1749 s->push_back(* (
_hitMap[3][t - 2]));
1750 s->push_back(* (
_hitMap[3][t - 1]));
1751 s->push_back(* (
_hitMap[3][t]));
1752 s->push_back(* (
_hitMap[3][0]));
1753 s->push_back(* (
_hitMap[4][t - 2]));
1754 s->push_back(* (
_hitMap[4][t - 1]));
1755 s->push_back(* (
_hitMap[4][t]));
1756 s->push_back(* (
_hitMap[4][0]));
1757 s->push_back(* (
_hitMap[4][1]));
1759 s->push_back(* (
_hitMap[0][t]));
1760 s->push_back(* (
_hitMap[1][t - 11]));
1761 s->push_back(* (
_hitMap[1][t]));
1762 s->push_back(* (
_hitMap[2][t - 1]));
1763 s->push_back(* (
_hitMap[2][t]));
1764 s->push_back(* (
_hitMap[2][0]));
1765 s->push_back(* (
_hitMap[3][t - 2]));
1766 s->push_back(* (
_hitMap[3][t - 1]));
1767 s->push_back(* (
_hitMap[3][t]));
1768 s->push_back(* (
_hitMap[3][0]));
1769 s->push_back(* (
_hitMap[4][t - 2]));
1770 s->push_back(* (
_hitMap[4][t - 1]));
1771 s->push_back(* (
_hitMap[4][t]));
1772 s->push_back(* (
_hitMap[4][t + 1]));
1773 s->push_back(* (
_hitMap[4][t + 2]));
1777 s->push_back(*
_priMap[t * 4 + 0]);
1778 s->push_back(*
_priMap[t * 4 + 1]);
1779 s->push_back(*
_priMap[t * 4 + 2]);
1780 s->push_back(*
_priMap[t * 4 + 3]);
1794 _tsfOut.push_back(forTracker);
1799 for (
unsigned i = 0; i < sc.size(); i++) {
1801 for (
unsigned j = 0; j < tsfStateChanges.size(); j++) {
1802 if (tsfStateChanges[j] == sc[i]) {
1807 if (! skip) tsfStateChanges.push_back(sc[i]);
1811 const unsigned pos = t / (nTSF / 4);
1813 trker[0].push_back(forTracker);
1814 trker[1].push_back(forTracker);
1815 }
else if (pos == 1) {
1816 trker[1].push_back(forTracker);
1817 trker[2].push_back(forTracker);
1818 }
else if (pos == 2) {
1819 trker[2].push_back(forTracker);
1820 trker[3].push_back(forTracker);
1822 trker[3].push_back(forTracker);
1823 trker[0].push_back(forTracker);
1846 std::sort(tsfStateChanges.begin(), tsfStateChanges.end());
1849 for (
unsigned i = 0; i < 4; i++) {
1864 const unsigned nTSF,
1868 const unsigned rem = t % 16;
1870 if ((rem > 1) && (rem < 14)) {
1871 s.push_back(*
_fasMap[t * 4 + 0]);
1872 s.push_back(*
_fasMap[t * 4 + 1]);
1873 s.push_back(*
_fasMap[t * 4 + 2]);
1874 s.push_back(*
_fasMap[t * 4 + 3]);
1880 for (
unsigned i = 0; i < 11; i++) {
1881 if (s[i + 1].active()) {
1889 s.push_back(*
_fasMap[t * 4 + 0]);
1890 s.push_back(*
_fasMap[t * 4 + 1]);
1891 s.push_back(*
_fasMap[t * 4 + 2]);
1892 s.push_back(*
_fasMap[t * 4 + 3]);
1896 const string sn =
"TSF fastest timing inner";
1901 t0.push_back(*
_fasMap[t * 4 + 0]);
1902 t0.push_back(*
_fasMap[t * 4 + 1]);
1903 t0.push_back(*
_fasMap[t * 4 + 2]);
1904 t0.push_back(*
_fasMap[t * 4 + 3]);
1910 unsigned n = t / 16;
1916 t1.push_back(*
_edg3Map[n * 4 + 0]);
1917 t1.push_back(*
_edg3Map[n * 4 + 1]);
1918 t1.push_back(*
_edg3Map[n * 4 + 2]);
1919 t1.push_back(*
_edg3Map[n * 4 + 3]);
1936 }
else if (rem == 1) {
1937 unsigned n = t / 16;
1943 t1.push_back(*
_edg4Map[n * 4 + 0]);
1944 t1.push_back(*
_edg4Map[n * 4 + 1]);
1945 t1.push_back(*
_edg4Map[n * 4 + 2]);
1946 t1.push_back(*
_edg4Map[n * 4 + 3]);
1963 }
else if (rem == 14) {
1964 unsigned n = t / 16 + 1;
1968 t1.push_back(*
_edg1Map[n * 4 + 0]);
1969 t1.push_back(*
_edg1Map[n * 4 + 1]);
1970 t1.push_back(*
_edg1Map[n * 4 + 2]);
1971 t1.push_back(*
_edg1Map[n * 4 + 3]);
1989 unsigned n = t / 16 + 1;
1993 t1.push_back(*
_edg2Map[n * 4 + 0]);
1994 t1.push_back(*
_edg2Map[n * 4 + 1]);
1995 t1.push_back(*
_edg2Map[n * 4 + 2]);
1996 t1.push_back(*
_edg2Map[n * 4 + 3]);
2016 vector<int> sc = t0.stateChanges();
2017 vector<int> tmp = t1.stateChanges();
2018 sc.insert(sc.end(), tmp.begin(), tmp.end());
2019 std::sort(sc.begin(), sc.end());
2024 for (
unsigned i = 0; i < sc.size(); i++) {
2032 unsigned tm0 = unsigned(ts0);
2033 unsigned tm1 = unsigned(ts1);
2034 bool th0 = ht0.
state(clk);
2035 bool th1 = ht1.
state(clk);
2037 if ((! th0) && (! th1))
2039 else if (th0 && th1) {
2072 vector<TRGSignalVector*>
2079 const int width = 10;
2083 TRGSignal l1 = s[1 + 1].widen(width) | s[2 + 1].widen(width);
2084 TRGSignal l2 = s[3 + 1].widen(width) | s[4 + 1].widen(width) |
2085 s[5 + 1].widen(width);
2086 TRGSignal l3 = s[6 + 1].widen(width) | s[7 + 1].widen(width) |
2087 s[8 + 1].widen(width) | s[9 + 1].widen(width);
2088 TRGSignal l4 = s[10 + 1].widen(width) | s[11 + 1].widen(width) |
2089 s[12 + 1].widen(width) | s[13 + 1].widen(width);
2102 vector<int> sc = s.stateChanges();
2103 for (
unsigned i = 0; i < sc.size(); i++) {
2105 TRGState st = s.state(clk).subset(1, 3);
2109 if (st[1] && st[2]) {
2118 vector<TRGSignalVector*> v;
2131 vector<int> sc = s.stateChanges();
2132 for (
unsigned i = 0; i < sc.size(); i++) {
2133 if (s.active(sc[i]))
2134 idv.
set(sid, sc[i]);
2146 for (
unsigned i = 0; i <
nOutput(); i++) {
2151 for (
unsigned i = 0; i <
_tsfIn.size(); i++)
2154 for (
unsigned i = 0; i <
_tsfOut.size(); i++)
2162 for (
unsigned i = 0; i < 5; i++)
2173 if (
_type == innerType)
2183 const string sn =
"TSF::simulate2 : " +
name();
2193 for (
unsigned i = 0; i <
nOutput(); i++) {
2198 for (
unsigned i = 0; i <
_tsfIn.size(); i++)
2201 for (
unsigned i = 0; i <
_tsfOut.size(); i++)
2209 for (
unsigned i = 0; i < 5; i++)
2221 const unsigned nTSF =
nInput() * 16;
2222 vector<TRGSignalVector*> trker[4];
2223 vector<int> tsfStateChanges;
2226 if (
_type == innerType)
2232 for (
unsigned t = 0; t < nTSF; t++) {
2239 if (
_type == innerType)
2245 vector<TRGSignalVector*> result =
simulateTSF(s, t);
2250 if (result.size() != result2.size()) {
2251 cout <<
"TSF::simulateTSF2 has different response(size)"
2254 for (
unsigned i = 0; i < result.size(); i++) {
2255 if ((* result[i]) != (* result2[i]))
2256 cout <<
"TSF::simulateTSF2 has different response"
2257 <<
"(contents)" << endl;
2265 _tsfOut.push_back(forTracker0);
2266 _tsfOut.push_back(forTracker1);
2270 for (
unsigned i = 0; i < sc.size(); i++) {
2272 for (
unsigned j = 0; j < tsfStateChanges.size(); j++) {
2273 if (tsfStateChanges[j] == sc[i]) {
2278 if (! skip) tsfStateChanges.push_back(sc[i]);
2282 const unsigned pos = t / (nTSF / 4);
2284 addID(* forTracker0, t - 3 * (nTSF / 4));
2285 addID(* forTracker1, t);
2286 trker[3].push_back(forTracker0);
2287 trker[0].push_back(forTracker1);
2288 }
else if (pos == 1) {
2289 addID(* forTracker0, t);
2290 addID(* forTracker1, t - 1 * (nTSF / 4));
2291 trker[0].push_back(forTracker0);
2292 trker[1].push_back(forTracker1);
2293 }
else if (pos == 2) {
2294 addID(* forTracker0, t - 1 * (nTSF / 4));
2295 addID(* forTracker1, t - 2 * (nTSF / 4));
2296 trker[1].push_back(forTracker0);
2297 trker[2].push_back(forTracker1);
2299 addID(* forTracker0, t - 2 * (nTSF / 4));
2300 addID(* forTracker1, t - 3 * (nTSF / 4));
2301 trker[2].push_back(forTracker0);
2302 trker[3].push_back(forTracker1);
2306 if (forTracker0->
active())
2312 std::sort(tsfStateChanges.begin(), tsfStateChanges.end());
2315 for (
unsigned i = 0; i < 4; i++) {
2343 for (
unsigned m = 0; m <
nInput(); m++) {
2348 for (
unsigned i = 0; i < 16; i++) {
2349 _secMap.push_back(& ((* b)[0][0][208 + i]));
2350 for (
unsigned j = 0; j < 5; j++) {
2351 _hitMap[j].push_back(& ((* b)[0][0][j * 16 + i]));
2356 for (
unsigned j = 0; j < 4; j++)
2357 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
2358 for (
unsigned j = 0; j < 4; j++)
2359 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
2362 for (
unsigned i = 0; i < 4; i++)
2363 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
2364 for (
unsigned i = 0; i < 4; i++)
2365 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
2366 for (
unsigned i = 0; i < 4; i++)
2367 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
2368 for (
unsigned i = 0; i < 4; i++)
2369 _edg3Map.push_back(& ((* b)[0][0][224 + 12 + i]));
2370 for (
unsigned i = 0; i < 4; i++)
2371 _edg4Map.push_back(& ((* b)[0][0][224 + 16 + i]));
2380 for (
unsigned m = 0; m <
nInput(); m++) {
2383 for (
unsigned i = 0; i < 16; i++) {
2384 _secMap.push_back(& ((* b)[0][0][208 + i]));
2385 for (
unsigned j = 0; j < 5; j++)
2387 for (
unsigned j = 0; j < 4; j++)
2388 _priMap.push_back(& ((* b)[0][0][80 + i * 4 + j]));
2389 for (
unsigned j = 0; j < 4; j++)
2390 _fasMap.push_back(& ((* b)[0][0][144 + i * 4 + j]));
2393 for (
unsigned i = 0; i < 4; i++)
2394 _edg0Map.push_back(& ((* b)[0][0][224 + i]));
2395 for (
unsigned i = 0; i < 4; i++)
2396 _edg1Map.push_back(& ((* b)[0][0][224 + 4 + i]));
2397 for (
unsigned i = 0; i < 4; i++)
2398 _edg2Map.push_back(& ((* b)[0][0][224 + 8 + i]));
2404 const unsigned nTSF,
2410 s->push_back(* (
_hitMap[0][0]));
2411 s->push_back(* (
_hitMap[1][nTSF - 1]));
2412 s->push_back(* (
_hitMap[1][0]));
2413 s->push_back(* (
_hitMap[2][nTSF - 1]));
2414 s->push_back(* (
_hitMap[2][0]));
2415 s->push_back(* (
_hitMap[2][1]));
2416 s->push_back(* (
_hitMap[3][nTSF - 2]));
2417 s->push_back(* (
_hitMap[3][nTSF - 1]));
2418 s->push_back(* (
_hitMap[3][0]));
2419 s->push_back(* (
_hitMap[3][1]));
2420 s->push_back(* (
_hitMap[4][nTSF - 2]));
2421 s->push_back(* (
_hitMap[4][nTSF - 1]));
2422 s->push_back(* (
_hitMap[4][0]));
2423 s->push_back(* (
_hitMap[4][1]));
2424 s->push_back(* (
_hitMap[4][2]));
2425 }
else if (t == 1) {
2426 s->push_back(* (
_hitMap[0][1]));
2427 s->push_back(* (
_hitMap[1][0]));
2428 s->push_back(* (
_hitMap[1][1]));
2429 s->push_back(* (
_hitMap[2][0]));
2430 s->push_back(* (
_hitMap[2][1]));
2431 s->push_back(* (
_hitMap[2][2]));
2432 s->push_back(* (
_hitMap[3][nTSF - 1]));
2433 s->push_back(* (
_hitMap[3][0]));
2434 s->push_back(* (
_hitMap[3][1]));
2435 s->push_back(* (
_hitMap[3][2]));
2436 s->push_back(* (
_hitMap[4][nTSF - 1]));
2437 s->push_back(* (
_hitMap[4][0]));
2438 s->push_back(* (
_hitMap[4][1]));
2439 s->push_back(* (
_hitMap[4][2]));
2440 s->push_back(* (
_hitMap[4][3]));
2441 }
else if (t == (nTSF - 2)) {
2442 s->push_back(* (
_hitMap[0][t]));
2443 s->push_back(* (
_hitMap[1][t - 11]));
2444 s->push_back(* (
_hitMap[1][t]));
2445 s->push_back(* (
_hitMap[2][t - 1]));
2446 s->push_back(* (
_hitMap[2][t]));
2447 s->push_back(* (
_hitMap[2][0]));
2448 s->push_back(* (
_hitMap[3][t - 2]));
2449 s->push_back(* (
_hitMap[3][t - 1]));
2450 s->push_back(* (
_hitMap[3][t]));
2451 s->push_back(* (
_hitMap[3][0]));
2452 s->push_back(* (
_hitMap[4][t - 2]));
2453 s->push_back(* (
_hitMap[4][t - 1]));
2454 s->push_back(* (
_hitMap[4][t]));
2455 s->push_back(* (
_hitMap[4][t + 1]));
2456 s->push_back(* (
_hitMap[4][0]));
2457 }
else if (t == (nTSF - 1)) {
2458 s->push_back(* (
_hitMap[0][t]));
2459 s->push_back(* (
_hitMap[1][t - 11]));
2460 s->push_back(* (
_hitMap[1][t]));
2461 s->push_back(* (
_hitMap[2][t - 1]));
2462 s->push_back(* (
_hitMap[2][t]));
2463 s->push_back(* (
_hitMap[2][0]));
2464 s->push_back(* (
_hitMap[3][t - 2]));
2465 s->push_back(* (
_hitMap[3][t - 1]));
2466 s->push_back(* (
_hitMap[3][t]));
2467 s->push_back(* (
_hitMap[3][0]));
2468 s->push_back(* (
_hitMap[4][t - 2]));
2469 s->push_back(* (
_hitMap[4][t - 1]));
2470 s->push_back(* (
_hitMap[4][t]));
2471 s->push_back(* (
_hitMap[4][0]));
2472 s->push_back(* (
_hitMap[4][1]));
2478 s->push_back(* (
_hitMap[0][t]));
2481 s->push_back(* (
_hitMap[1][t]));
2482 s->push_back(* (
_hitMap[2][t - 1]));
2483 s->push_back(* (
_hitMap[2][t]));
2484 s->push_back(* (
_hitMap[2][0]));
2485 s->push_back(* (
_hitMap[3][t - 2]));
2486 s->push_back(* (
_hitMap[3][t - 1]));
2487 s->push_back(* (
_hitMap[3][t]));
2488 s->push_back(* (
_hitMap[3][0]));
2489 s->push_back(* (
_hitMap[4][t - 2]));
2490 s->push_back(* (
_hitMap[4][t - 1]));
2491 s->push_back(* (
_hitMap[4][t]));
2492 s->push_back(* (
_hitMap[4][t + 1]));
2493 s->push_back(* (
_hitMap[4][t + 2]));
2513 const unsigned nTSF,
2519 s->push_back(* (
_hitMap[0][nTSF - 1]));
2520 s->push_back(* (
_hitMap[0][0]));
2521 s->push_back(* (
_hitMap[0][1]));
2522 s->push_back(* (
_hitMap[1][nTSF - 1]));
2523 s->push_back(* (
_hitMap[1][0]));
2524 s->push_back(* (
_hitMap[2][0]));
2525 s->push_back(* (
_hitMap[3][nTSF - 1]));
2526 s->push_back(* (
_hitMap[3][0]));
2527 s->push_back(* (
_hitMap[4][nTSF - 1]));
2528 s->push_back(* (
_hitMap[4][0]));
2529 s->push_back(* (
_hitMap[4][1]));
2530 }
else if (t == (nTSF - 1)) {
2531 s->push_back(* (
_hitMap[0][nTSF - 2]));
2532 s->push_back(* (
_hitMap[0][nTSF - 1]));
2533 s->push_back(* (
_hitMap[0][0]));
2534 s->push_back(* (
_hitMap[1][nTSF - 2]));
2535 s->push_back(* (
_hitMap[1][nTSF - 1]));
2536 s->push_back(* (
_hitMap[2][nTSF - 1]));
2537 s->push_back(* (
_hitMap[3][nTSF - 2]));
2538 s->push_back(* (
_hitMap[3][nTSF - 1]));
2540 s->push_back(* (
_hitMap[4][nTSF - 2]));
2541 s->push_back(* (
_hitMap[4][nTSF - 1]));
2542 s->push_back(* (
_hitMap[4][0]));
2544 s->push_back(* (
_hitMap[0][t - 1]));
2545 s->push_back(* (
_hitMap[0][t]));
2546 s->push_back(* (
_hitMap[0][t + 1]));
2547 s->push_back(* (
_hitMap[1][t - 1]));
2548 s->push_back(* (
_hitMap[1][t]));
2549 s->push_back(* (
_hitMap[2][t]));
2550 s->push_back(* (
_hitMap[3][t - 1]));
2551 s->push_back(* (
_hitMap[3][t]));
2552 s->push_back(* (
_hitMap[4][t - 1]));
2553 s->push_back(* (
_hitMap[4][t]));
2554 s->push_back(* (
_hitMap[4][t + 1]));
2573 TSFinder::packerForTracker(vector<TRGSignalVector*>& hitList,
2575 const unsigned maxHit)
2581 for (
unsigned ci = 0; ci < cList.size(); ci++) {
2582 unsigned cntHit = 0;
2583 for (
unsigned hi = 0; hi < hitList.size(); hi++) {
2584 TRGState s = (* hitList[hi]).state(cList[ci]);
2586 if (cntHit >= maxHit)
continue;
2587 for (
unsigned j = 0; j < 21; j++) {
2588 if ((* hitList[hi])[j].state(cList[ci])) {
2589 (* result)[21 * (maxHit - 1) - (cntHit * 21) + j]
2590 .set(cList[ci], cList[ci] + 1);
2594 TRGState t = hitList[hi]->state(cList[ci]).subset(13, 8);
2596 << unsigned(t) <<
"(" << t <<
")" << endl;
2608 vector <TRGSignalVector*>
2609 TSFinder::simulateTSFOld(TRGSignalVector* in,
unsigned tsid)
2615 TCSegment* tsi = _tsSL[tsid];
2616 vector <TRGSignalVector*> result;
2619 vector<bool> fTimeVect;
2623 vector <bool> tmpOutBool;
2626 TRGSignalVector* resultT =
new TRGSignalVector(na, in->clock(), 13);
2627 TRGSignalVector* resultE =
new TRGSignalVector(na, in->clock(), 10);
2628 TRGSignalVector* Hitmap =
new TRGSignalVector(na +
"HitMap", in->clock(), 0);
2629 TRGSignalVector pTime(na +
"PriorityTime", in->clock(), 0);
2630 TRGSignalVector fTime(na +
"FastestTime", in->clock(), 0);
2631 TRGSignal* pri0 = 0;
2632 TRGSignal* pri1 = 0;
2633 TRGSignal* pri2 = 0;
2634 if (_type == innerType) {
2635 for (
unsigned i = 0; i < 16; i++) {
2636 Hitmap->push_back((* in)[i]);
2637 (* Hitmap)[i].widen(16);
2639 for (
unsigned i = 0; i < 4; i++) {
2640 pTime.push_back((* in)[i + 16]);
2641 fTime.push_back((* in)[i + 20]);
2643 pri0 = & (*Hitmap)[1];
2644 pri1 = & (*Hitmap)[2];
2645 pri2 = & (*Hitmap)[3];
2647 for (
unsigned i = 0; i < 12; i++) {
2648 Hitmap->push_back((* in)[i]);
2649 (* Hitmap)[i].widen(16);
2651 for (
unsigned i = 0; i < 4; i++) {
2652 pTime.push_back((* in)[i + 12]);
2653 fTime.push_back((* in)[i + 16]);
2655 pri0 = & (*Hitmap)[6];
2656 pri1 = & (*Hitmap)[7];
2657 pri2 = & (*Hitmap)[8];
2661 const TRGSignalVector& cc = in->clock().clockCounter();
2662 for (
unsigned i = 0; i < 5; i++) {
2663 pTime.push_back(cc[i]);
2664 fTime.push_back(cc[i]);
2667 vector <int> changeTime = Hitmap->stateChanges();
2669 int* LUTValue =
new int[changeTime.size()];
2670 if (changeTime.size()) {
2672 const string fn =
"TSF::simulateTSF:tsid=" + to_string(tsid);
2675 int hitPosition = 0;
2680 fTime.state(changeTime[0]).copy2bool(fTimeBool);
2681 fTimeBool[9] =
true;
2682 fTimeVect.insert(fTimeVect.begin(), fTimeBool, fTimeBool + 10);
2685 for (
unsigned i = 0; i < changeTime.size(); i++) {
2686 int ct = changeTime[i];
2689 LUTValue[i] = tsi->LUT()->getValue(
unsigned(Hitmap->state(ct)));
2692 if ((LUTValue[i]) && (eOUT)) {
2693 resultE->set(fTimeVect, ct);
2697 bool priority1rise = pri0->riseEdge(ct);
2698 bool priority2rise = pri1->riseEdge(ct) | pri2->riseEdge(ct);
2702 if (priority1rise) {
2705 tmpPTime = unsigned(pTime.state(ct));
2707 }
else if (priority2rise) {
2710 tmpPTime = unsigned(pTime.state(ct));
2712 if ((*Hitmap)[0].state(ct)) hitPosition = 2;
2713 else hitPosition = 1;
2718 if ((hitPosition) && (LUTValue[i]) && ((ct - tmpCTime) < 16)) {
2719 tmpOutInt = tmpPTime * pow(2, 4) +
2720 LUTValue[i] * pow(2, 2) + hitPosition;
2721 tmpOutBool = mkbool(tmpOutInt, 13);
2723 if (hitPosition == 3) {
2724 if (priority1rise) {
2725 resultT->set(tmpOutBool, ct);
2727 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2728 if (!((LUTValue[i - 1] == 1) |
2729 (LUTValue[i - 1] == 2)))
2730 resultT->set(tmpOutBool, ct);
2732 if (!(LUTValue[i - 1])) resultT->set(tmpOutBool, ct);
2736 if (priority2rise) resultT->set(tmpOutBool, ct);
2738 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2739 if (!((LUTValue[i - 1] == 1) |
2740 (LUTValue[i - 1] == 2)))
2741 resultT->set(tmpOutBool, ct);
2743 if (!(LUTValue[i])) resultT->set(tmpOutBool, ct);
2751 <<
", pattern=" << Hitmap->state(ct)
2752 <<
", LUT=" << LUTValue[i]
2753 <<
", pri=" << priority1rise
2754 <<
", sec=" << priority2rise
2755 <<
", hitPos=" << hitPosition
2756 <<
", (clk-tmpCTime)=" << (ct - tmpCTime)
2764 result.push_back(resultT);
2765 result.push_back(resultE);
2773 vector <TRGSignalVector*>
2774 TSFinder::simulateTSF(TRGSignalVector* in,
unsigned tsid)
2780 TCSegment* tsi = _tsSL[tsid];
2781 vector <TRGSignalVector*> result;
2784 vector<bool> fTimeVect;
2788 vector <bool> tmpOutBool;
2790 TRGSignalVector* resultT =
new TRGSignalVector(na, in->clock(), 13);
2791 TRGSignalVector* resultE =
new TRGSignalVector(na, in->clock(), 10);
2792 TRGSignalVector* Hitmap =
new TRGSignalVector(na +
"HitMap",
2795 TRGSignalVector pTime(na +
"PriorityTime", in->clock(), 0);
2796 TRGSignalVector fTime(na +
"FastestTime", in->clock(), 0);
2797 TRGSignal* pri0 = 0;
2798 TRGSignal* pri1 = 0;
2799 TRGSignal* pri2 = 0;
2800 if (_type == innerType) {
2801 for (
unsigned i = 0; i < 16; i++) {
2802 Hitmap->push_back((* in)[i]);
2803 (* Hitmap)[i].widen(16);
2805 for (
unsigned i = 0; i < 4; i++) {
2806 pTime.push_back((* in)[i + 16]);
2807 fTime.push_back((* in)[i + 20]);
2809 pri0 = & (*Hitmap)[1];
2810 pri1 = & (*Hitmap)[2];
2811 pri2 = & (*Hitmap)[3];
2813 for (
unsigned i = 0; i < 12; i++) {
2814 Hitmap->push_back((* in)[i]);
2815 (* Hitmap)[i].widen(16);
2817 for (
unsigned i = 0; i < 4; i++) {
2818 pTime.push_back((* in)[i + 12]);
2819 fTime.push_back((* in)[i + 16]);
2821 pri0 = & (*Hitmap)[6];
2822 pri1 = & (*Hitmap)[7];
2823 pri2 = & (*Hitmap)[8];
2827 const TRGSignalVector& cc = in->clock().clockCounter();
2828 for (
unsigned i = 0; i < 5; i++) {
2829 pTime.push_back(cc[i]);
2830 fTime.push_back(cc[i]);
2833 vector<int> changeTime = Hitmap->stateChanges();
2835 int* LUTValue =
new int[changeTime.size()];
2837 int lastFastHit = in->clock().min();
2838 if (changeTime.size()) {
2841 const string fn =
"TSF::simulateTSF:tsid=" + to_string(tsid);
2844 int hitPosition = 0;
2850 for (
unsigned i = 0; i < changeTime.size(); i++) {
2852 int ct = changeTime[i];
2853 TRGState st = Hitmap->state(ct);
2857 LUTValue[i] = tsi->LUT()->getValue(
unsigned(st));
2860 bool active = st.active();
2862 const int timeCounter = ct - lastFastHit;
2865 if (timeCounter > 15) {
2867 TRGState ftnow = fTime.state(ct);
2868 ftnow += TRGState(1, 1);
2875 if ((LUTValue[i])) {
2877 resultE->set(fTimeVect, ct);
2882 bool priority1rise = pri0->riseEdge(ct);
2883 bool priority2rise = pri1->riseEdge(ct) | pri2->riseEdge(ct);
2887 if (priority1rise) {
2889 tmpPTime = unsigned(pTime.state(ct));
2891 }
else if (priority2rise) {
2893 tmpPTime = unsigned(pTime.state(ct));
2895 if ((*Hitmap)[0].state(ct)) hitPosition = 2;
2896 else hitPosition = 1;
2901 if ((ct - tmpCTime) < 16) {
2902 if ((hitPosition) && (LUTValue[i])) {
2905 tmpOutInt = tmpPTime * pow(2, 4) +
2906 LUTValue[i] * pow(2, 2) + hitPosition;
2907 tmpOutBool = mkbool(tmpOutInt, 13);
2909 if (hitPosition == 3) {
2910 if (priority1rise) {
2911 resultT->set(tmpOutBool, ct);
2912 oldLUT = LUTValue[i];
2914 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2915 if (!((oldLUT == 1) |
2917 resultT->set(tmpOutBool, ct);
2918 oldLUT = LUTValue[i];
2921 if (!(LUTValue[i - 1])) {
2922 resultT->set(tmpOutBool, ct);
2923 oldLUT = LUTValue[i];
2928 if ((priority2rise) && (!oldLUT)) resultT->set(tmpOutBool, ct);
2930 if ((LUTValue[i] == 1) | (LUTValue[i] == 2)) {
2931 if (!((oldLUT == 1) |
2933 resultT->set(tmpOutBool, ct);
2934 oldLUT = LUTValue[i];
2938 resultT->set(tmpOutBool, ct);
2939 oldLUT = LUTValue[i];
2952 <<
", pattern=" << st
2953 <<
", LUT=" << LUTValue[i]
2954 <<
", pri=" << priority1rise
2955 <<
", sec=" << priority2rise
2956 <<
", hitPos=" << hitPosition
2957 <<
", (clk-tmpCTime)=" << (ct - tmpCTime)
2965 vector<int> sc = resultT->stateChanges();
2966 vector<unsigned> lv;
2967 for (
unsigned i = 0; i < sc.size(); i++) {
2969 unsigned l = unsigned(resultT->state(sc[i]).subset(2, 2));
2971 cout <<
"clk=" << sc[i] <<
" LUT output[" << i <<
"]=" << l << endl;
2973 bool found1or2 =
false;
2974 bool found3 =
false;
2975 for (
unsigned i = 0; i < lv.size(); i++) {
2976 if (found1or2 && (lv[i] > 0))
2977 cout <<
"!!! simulateTSF something wrong(found1or2)" << endl;
2978 if (found3 && (lv[i] == 3))
2979 cout <<
"!!! simulateTSF something wrong(found3)" << endl;
2981 if ((lv[i] == 1) & (lv[i] == 2))
2983 else if (lv[i] == 3)
2988 result.push_back(resultT);
2989 result.push_back(resultE);
2996 vector <TRGSignalVector*>
2997 TSFinder::simulateTSF2(TRGSignalVector* in,
unsigned tsid)
3003 TCSegment* tsi = _tsSL[tsid];
3004 vector <TRGSignalVector*> result;
3007 vector<bool> fTimeVect;
3011 TRGSignalVector* resultT =
new TRGSignalVector(na, in->clock(), 13);
3012 TRGSignalVector* resultE =
new TRGSignalVector(na, in->clock(), 10);
3013 TRGSignalVector* Hitmap =
new TRGSignalVector(na +
"HitMap",
3016 TRGSignalVector pTime(na +
"PriorityTime", in->clock(), 0);
3017 TRGSignalVector fTime(na +
"FastestTime", in->clock(), 0);
3018 TRGSignal* pri0 = 0;
3019 TRGSignal* pri1 = 0;
3020 TRGSignal* pri2 = 0;
3022 if (_type == innerType) {
3023 for (
unsigned i = 0; i < 16; i++) {
3024 Hitmap->push_back((* in)[i]);
3025 (* Hitmap)[i].widen(16);
3027 for (
unsigned i = 0; i < 4; i++) {
3028 pTime.push_back((* in)[i + 16]);
3029 fTime.push_back((* in)[i + 20]);
3031 pri0 = & (*Hitmap)[1];
3032 pri1 = & (*Hitmap)[2];
3033 pri2 = & (*Hitmap)[3];
3035 for (
unsigned i = 0; i < 12; i++) {
3036 Hitmap->push_back((* in)[i]);
3037 (* Hitmap)[i].widen(16);
3039 for (
unsigned i = 0; i < 4; i++) {
3040 pTime.push_back((* in)[i + 12]);
3041 fTime.push_back((* in)[i + 16]);
3043 pri0 = & (*Hitmap)[6];
3044 pri1 = & (*Hitmap)[7];
3045 pri2 = & (*Hitmap)[8];
3049 const TRGSignalVector& cc = in->clock().clockCounter();
3050 for (
unsigned i = 0; i < 5; i++) {
3051 pTime.push_back(cc[i]);
3052 fTime.push_back(cc[i]);
3055 vector<int> changeTime = Hitmap->stateChanges();
3057 vector<unsigned> luts;
3058 int lastFastHit = in->clock().min();
3060 if (changeTime.size()) {
3062 const string fn =
"TSF::simulateTSF2:tsid=" + to_string(tsid);
3068 unsigned stateHitPos = 0;
3069 unsigned hitPos = 0;
3070 unsigned timing = 0;
3071 int timePosFound = 0;
3074 unsigned stateLR = 0;
3078 for (
unsigned i = 0; i < changeTime.size(); i++) {
3080 const int ct = changeTime[i];
3081 const TRGState st = Hitmap->state(ct);
3085 const unsigned lut = tsi->LUT()->getValue(
unsigned(st));
3086 luts.push_back(lut);
3089 const bool active = st.active();
3091 const int timeCounter = ct - lastFastHit;
3094 if (timeCounter > 15) {
3096 TRGState ftnow = fTime.state(ct);
3097 ftnow += TRGState(1, 1);
3106 resultE->set(fTimeVect, ct);
3112 const bool hit1st = pri0->riseEdge(ct);
3113 const bool hit2nd0 = pri1->riseEdge(ct);
3114 const bool hit2nd1 = pri2->riseEdge(ct);
3115 const bool hit2nd = hit2nd0 || hit2nd1;
3120 if (stateHitPos == 0) {
3126 timing = unsigned(pTime.state(ct));
3129 }
else if (hit2nd) {
3130 if ((* Hitmap)[0].state(ct))
3134 timing = unsigned(pTime.state(ct));
3141 else if (stateHitPos == 1) {
3142 counterPos = ct - timePosFound;
3143 if (counterPos > 15)
3148 else if (stateHitPos == 2) {
3151 timing = unsigned(pTime.state(ct));
3155 counterPos = ct - timePosFound;
3156 if (counterPos > 15)
3163 cout <<
"TSF::simulateTSF2 !!! strange state in hit position"
3172 const unsigned val = (timing << 4) | (lut << 2) | hitPos;
3173 const TRGState output(13, val);
3174 resultT->set(output, ct);
3176 if ((lut == 1) || (lut == 2))
3182 if (((lut == 1) || (lut == 2)) && (stateHitPos == 0))
3184 <<
"!!! state machines incosistent" << endl;
3190 else if (stateLR == 1) {
3192 if (counterPos > 15)
3197 else if (stateLR == 2) {
3199 if ((lut == 1) || (lut == 2)) {
3200 const unsigned val = (timing << 4) | (lut << 2) |
3202 const TRGState output(13, val);
3203 resultT->set(output, ct);
3208 if (counterPos > 15)
3216 cout <<
"TSF::simulateTSF2 !!! strange state in L/R decision"
3224 <<
", pri=" << hit1st
3225 <<
", sec=" << hit2nd
3226 <<
", hPos=" << hitPos
3227 <<
", ctr=" << counterPos
3228 <<
", states=" << stateHitPos <<
"," << stateLR
3236 vector<int> sc = resultT->stateChanges();
3237 vector<unsigned> lv;
3238 for (
unsigned i = 0; i < sc.size(); i++) {
3240 unsigned l = unsigned(resultT->state(sc[i]).subset(2, 2));
3242 cout <<
"clk=" << sc[i] <<
" LUT output[" << i <<
"]=" << l << endl;
3246 result.push_back(resultT);
3247 result.push_back(resultE);