14 #define TRG_SHORT_NAMES
15 #define TRGCDC_SHORT_NAMES
17 #include "trg/trg/Utilities.h"
18 #include "trg/trg/Debug.h"
19 #include "trg/trg/State.h"
20 #include "trg/cdc/TRGCDC.h"
21 #include "trg/cdc/FrontEnd.h"
22 #include "trg/cdc/Wire.h"
32 TRGCDCFrontEnd::TRGCDCFrontEnd(
const std::string& name,
56 return (
"TRGCDCFrontEnd version 0.01");
72 outfile <<
"-- inner type" << endl;
73 string cname =
"TRGCDCFrontEndInnerInside";
80 outfile <<
"--" << endl;
82 outfile <<
" component " << cname << endl;
84 outfile <<
" end component;" << endl;
86 outfile <<
"--------------------------------------------------------------"
89 outfile <<
"entity " << cname <<
"is" << endl;
91 outfile <<
"end " << cname <<
";" << endl;
93 outfile <<
"architecture Behavioral of " << cname <<
" is" << endl;
94 outfile <<
" -- local" << endl;
96 outfile <<
"begin" << endl;
97 outfile <<
"end Behavioral;" << endl;
106 outfile <<
" port (" << endl;
109 outfile <<
" -- 125MHz clock (TRG system clock)" << endl;
110 outfile <<
" clk : in std_logic;" << endl;
113 outfile <<
" -- Coarse timing (counter with 125MHz clock)" << endl;
114 outfile <<
" tmc : in std_logic_vector(0 to 12);" << endl;
117 outfile <<
" -- Hit pattern(48 bits for 48 wires)" << endl;
118 outfile <<
" ptn : in std_logic_vector(0 to 47);" << endl;
121 outfile <<
" -- Fine timing within 125MHz clock" << endl;
122 for (
unsigned i = 0; i < 48; i++) {
123 outfile <<
" w" << TRGUtil::itostring(i)
124 <<
" : in std_logic_vector(0 to 3);" << endl;
128 outfile <<
" -- Hit pattern output" << endl;
129 outfile <<
" hit : out std_logic_vector(0 to 47);" << endl;
130 outfile <<
" -- 4 bit fine timing for 16 priority wires" << endl;
131 outfile <<
" pri : out std_logic_vector(0 to 63);" << endl;
132 outfile <<
" -- 2 bit fine timing for the fastest hit in 16 TS"
134 outfile <<
" fst : out std_logic_vector(0 to 31)" << endl;
135 outfile <<
" );" << endl;
143 std::vector<const TRGCDCWire*>::push_back(a);
159 for (
unsigned i = 0; i <
_isb->size(); i++)
164 for (
unsigned i = 0; i <
_osb->size(); i++)
173 const unsigned nWires = size();
175 for (
unsigned i = 0; i < nWires; i++) {
178 input += (* this)[i]->signal();
182 const string ni =
name() +
"InputSignalBundle";
187 pattern->
clock(dClock);
188 pattern->
name(
name() +
"@dataClock");
189 _isb->push_back(pattern);
203 for (
unsigned i = 0; i < nWires; i++) {
206 const string n = s.name() +
":5bits";
210 if (!(* pattern)[i].active()) {
216 bit5->push_back(sig0);
217 bit5->push_back(sig1);
218 bit5->push_back(sig2);
219 bit5->push_back(sig3);
220 bit5->push_back(sig4);
234 const std::vector<int> timing = s.stateChanges();
235 const unsigned nStates = timing.size();
237 for (
unsigned j = 0; j < nStates; j++) {
238 const int pos = timing[j];
242 const double at = s.clock().absoluteTime(pos);
243 const int pos1 = dClock.
position(at);
244 const double phase = dClock.
phase(at);
245 const unsigned bits = unsigned(phase / (360. / 32.));
252 for (
unsigned k = 0; k < 5; k++) {
254 (*bit5)[k].set(pos1, pos1 + 1);
257 for (
unsigned k = 0; k < 5; k++) {
261 sig.
set(pos1, pos1 + 1);
300 _isb->push_back(bit5);
307 const string no =
name() +
"OutputSignalBundle";
308 if (
type() == innerInside)
313 TCFrontEnd::packerInnerInside);
314 else if (
type() == innerOutside)
319 TCFrontEnd::packerInnerOutside);
320 else if (
type() == outerInside)
325 TCFrontEnd::packerOuterInside);
326 else if (
type() == outerOutside)
331 TCFrontEnd::packerOuterOutside);
342 TCFrontEnd::packerInnerInside(
const TRGState& input)
365 TRGState s(32 + 16 * 5 + 16 + 16 * 5 + 1 * 5 + 43);
368 bool* b =
new bool[input.size()];
372 const bool*
const hitptn = & b[16];
373 const bool*
const timing[32] = {
374 & b[128], & b[133], & b[138], & b[143],
375 & b[148], & b[153], & b[158], & b[163],
376 & b[168], & b[173], & b[178], & b[183],
377 & b[188], & b[193], & b[198], & b[203],
378 & b[208], & b[213], & b[218], & b[223],
379 & b[228], & b[233], & b[238], & b[243],
380 & b[248], & b[253], & b[258], & b[263],
381 & b[268], & b[273], & b[278], & b[283]
385 s.set(0, 32, hitptn);
391 TRGState secondPriority(16);
392 for (
unsigned i = 0; i < 16; i++) {
396 s.set(p, 5, timing[i]);
405 s.set(p, 5, timing[16]);
406 secondPriority.set(i,
true);
409 secondPriority.set(i,
false);
417 if (hitptn[i + 15] && hitptn[i + 16]) {
421 s.set(p, 5, timing[i + 15]);
422 secondPriority.set(i,
false);
424 s.set(p, 5, timing[i + 16]);
425 secondPriority.set(i,
true);
430 else if (hitptn[i + 15]) {
431 s.set(p, 5, timing[i + 15]);
432 secondPriority.set(i,
false);
436 else if (hitptn[i + 16]) {
437 s.set(p, 5, timing[i + 16]);
438 secondPriority.set(i,
true);
452 s.set(p, secondPriority);
456 for (
unsigned i = 0; i < 16; i++) {
460 const bool h[2] = {hitptn[0], hitptn[16]};
472 s.set(p, 5, timing[0]);
473 }
else if (hh == 2) {
474 s.set(p, 5, timing[16]);
480 s.set(p, 5, timing[0]);
482 s.set(p, 5, timing[16]);
488 const unsigned i0 = i;
489 const unsigned i1 = i + 15;
490 const unsigned i2 = i + 16;
491 const bool h[3] = {hitptn[i0], hitptn[i1], hitptn[i2]};
508 s.set(p, 5, timing[i0]);
511 }
else if (hh == 2) {
513 s.set(p, 5, timing[i1]);
514 }
else if (hh == 4) {
516 s.set(p, 5, timing[i2]);
522 s.set(p, 5, timing[i0]);
524 s.set(p, 5, timing[i1]);
525 }
else if (hh == 5) {
527 s.set(p, 5, timing[i0]);
529 s.set(p, 5, timing[i2]);
530 }
else if (hh == 6) {
532 s.set(p, 5, timing[i1]);
534 s.set(p, 5, timing[i2]);
539 if ((t0 <= t1) && (t0 <= t2))
540 s.set(p, 5, timing[i0]);
542 s.set(p, 5, timing[i1]);
544 s.set(p, 5, timing[i2]);
553 s.set(p, 5, timing[31]);
572 TCFrontEnd::packerInnerOutside(
const TRGState& input)
595 TRGState s(48 + 16 * 5 + 4 * 5 + 108);
598 bool* b =
new bool[input.size()];
602 const bool*
const hitptn = & b[0];
603 const bool*
const timing[48] = {
604 & b[48], & b[53], & b[58], & b[63],
605 & b[68], & b[73], & b[78], & b[83],
606 & b[88], & b[93], & b[98], & b[103],
607 & b[108], & b[113], & b[118], & b[123],
608 & b[128], & b[133], & b[138], & b[143],
609 & b[148], & b[153], & b[158], & b[163],
610 & b[168], & b[173], & b[178], & b[183],
611 & b[188], & b[193], & b[198], & b[203],
612 & b[208], & b[213], & b[218], & b[223],
613 & b[228], & b[233], & b[238], & b[243],
614 & b[248], & b[253], & b[258], & b[263],
615 & b[268], & b[273], & b[278], & b[283]
619 s.set(0, 48, hitptn);
623 const bool dummy[6] = {
false,
false,
false,
false,
false,
true},
624 dummymax[5] = {
true,
true,
true,
true,
true};
625 const TRGState wtDummy(6, dummy), wtDummymax(5, dummymax);
626 for (
unsigned i = 0; i < 20; i++) {
631 wt[1] = TRGState(5, timing[0]);
632 wt[2] = TRGState(5, timing[1]);
635 wt[5] = TRGState(5, timing[16]);
636 wt[6] = TRGState(5, timing[17]);
639 wt[9] = TRGState(5, timing[32]);
640 wt[10] = TRGState(5, timing[33]);
641 wt[11] = TRGState(5, timing[34]);
644 if (! hitptn[0]) wt[1].set(5,
true);
645 if (! hitptn[1]) wt[2].set(5,
true);
646 if (! hitptn[16]) wt[5].set(5,
true);
647 if (! hitptn[17]) wt[6].set(5,
true);
648 if (! hitptn[32]) wt[9].set(5,
true);
649 if (! hitptn[33]) wt[10].set(5,
true);
650 if (! hitptn[34]) wt[11].set(5,
true);
652 wt[0] = TRGState(5, timing[0]);
653 wt[1] = TRGState(5, timing[1]);
654 wt[2] = TRGState(5, timing[2]);
656 wt[4] = TRGState(5, timing[16]);
657 wt[5] = TRGState(5, timing[17]);
658 wt[6] = TRGState(5, timing[18]);
660 wt[8] = TRGState(5, timing[32]);
661 wt[9] = TRGState(5, timing[33]);
662 wt[10] = TRGState(5, timing[34]);
663 wt[11] = TRGState(5, timing[35]);
666 if (! hitptn[0]) wt[0].set(5,
true);
667 if (! hitptn[1]) wt[1].set(5,
true);
668 if (! hitptn[2]) wt[2].set(5,
true);
669 if (! hitptn[16]) wt[4].set(5,
true);
670 if (! hitptn[17]) wt[5].set(5,
true);
671 if (! hitptn[18]) wt[6].set(5,
true);
672 if (! hitptn[32]) wt[8].set(5,
true);
673 if (! hitptn[33]) wt[9].set(5,
true);
674 if (! hitptn[34]) wt[10].set(5,
true);
675 if (! hitptn[35]) wt[11].set(5,
true);
676 }
else if (i == 14) {
677 wt[0] = TRGState(5, timing[13]);
678 wt[1] = TRGState(5, timing[14]);
679 wt[2] = TRGState(5, timing[15]);
680 wt[3] = TRGState(5, timing[28]);
681 wt[4] = TRGState(5, timing[29]);
682 wt[5] = TRGState(5, timing[30]);
683 wt[6] = TRGState(5, timing[31]);
684 wt[7] = TRGState(5, timing[44]);
685 wt[8] = TRGState(5, timing[45]);
686 wt[9] = TRGState(5, timing[46]);
687 wt[10] = TRGState(5, timing[47]);
691 if (! hitptn[13]) wt[0].set(5,
true);
692 if (! hitptn[14]) wt[1].set(5,
true);
693 if (! hitptn[15]) wt[2].set(5,
true);
694 if (! hitptn[28]) wt[3].set(5,
true);
695 if (! hitptn[29]) wt[4].set(5,
true);
696 if (! hitptn[30]) wt[5].set(5,
true);
697 if (! hitptn[31]) wt[6].set(5,
true);
698 if (! hitptn[44]) wt[7].set(5,
true);
699 if (! hitptn[45]) wt[8].set(5,
true);
700 if (! hitptn[46]) wt[9].set(5,
true);
701 if (! hitptn[47]) wt[10].set(5,
true);
702 }
else if (i == 15) {
703 wt[0] = TRGState(5, timing[14]);
704 wt[1] = TRGState(5, timing[15]);
706 wt[3] = TRGState(5, timing[29]);
707 wt[4] = TRGState(5, timing[30]);
708 wt[5] = TRGState(5, timing[31]);
710 wt[7] = TRGState(5, timing[45]);
711 wt[8] = TRGState(5, timing[46]);
712 wt[9] = TRGState(5, timing[47]);
717 if (! hitptn[14]) wt[0].set(5,
true);
718 if (! hitptn[15]) wt[1].set(5,
true);
719 if (! hitptn[29]) wt[3].set(5,
true);
720 if (! hitptn[30]) wt[4].set(5,
true);
721 if (! hitptn[31]) wt[5].set(5,
true);
722 if (! hitptn[45]) wt[7].set(5,
true);
723 if (! hitptn[46]) wt[8].set(5,
true);
724 if (! hitptn[47]) wt[9].set(5,
true);
725 }
else if (i == 16) {
737 wt[11] = TRGState(5, timing[32]);
740 if (! hitptn[32]) wt[11].set(5,
true);
741 }
else if (i == 17) {
744 wt[2] = TRGState(5, timing[0]);
748 wt[6] = TRGState(5, timing[16]);
752 wt[10] = TRGState(5, timing[32]);
753 wt[11] = TRGState(5, timing[33]);
756 if (! hitptn[0]) wt[2].set(5,
true);
757 if (! hitptn[16]) wt[6].set(5,
true);
758 if (! hitptn[32]) wt[10].set(5,
true);
759 if (! hitptn[33]) wt[11].set(5,
true);
760 }
else if (i == 18) {
761 wt[0] = TRGState(5, timing[15]);
764 wt[3] = TRGState(5, timing[30]);
765 wt[4] = TRGState(5, timing[31]);
768 wt[7] = TRGState(5, timing[46]);
769 wt[8] = TRGState(5, timing[47]);
775 if (! hitptn[15]) wt[0].set(5,
true);
776 if (! hitptn[30]) wt[3].set(5,
true);
777 if (! hitptn[31]) wt[4].set(5,
true);
778 if (! hitptn[46]) wt[7].set(5,
true);
779 if (! hitptn[47]) wt[8].set(5,
true);
780 }
else if (i == 19) {
784 wt[3] = TRGState(5, timing[31]);
788 wt[7] = TRGState(5, timing[47]);
795 if (! hitptn[31]) wt[3].set(5,
true);
796 if (! hitptn[47]) wt[7].set(5,
true);
798 wt[0] = TRGState(5, timing[i - 1]);
799 wt[1] = TRGState(5, timing[i]);
800 wt[2] = TRGState(5, timing[i + 1]);
801 wt[3] = TRGState(5, timing[i + 14]);
802 wt[4] = TRGState(5, timing[i + 15]);
803 wt[5] = TRGState(5, timing[i + 16]);
804 wt[6] = TRGState(5, timing[i + 17]);
805 wt[7] = TRGState(5, timing[i + 30]);
806 wt[8] = TRGState(5, timing[i + 31]);
807 wt[9] = TRGState(5, timing[i + 32]);
808 wt[10] = TRGState(5, timing[i + 33]);
809 wt[11] = TRGState(5, timing[i + 34]);
812 if (! hitptn[i - 1]) wt[0].set(5,
true);
813 if (! hitptn[i]) wt[1].set(5,
true);
814 if (! hitptn[i + 1]) wt[2].set(5,
true);
815 if (! hitptn[i + 14]) wt[3].set(5,
true);
816 if (! hitptn[i + 15]) wt[4].set(5,
true);
817 if (! hitptn[i + 16]) wt[5].set(5,
true);
818 if (! hitptn[i + 17]) wt[6].set(5,
true);
819 if (! hitptn[i + 30]) wt[7].set(5,
true);
820 if (! hitptn[i + 31]) wt[8].set(5,
true);
821 if (! hitptn[i + 32]) wt[9].set(5,
true);
822 if (! hitptn[i + 33]) wt[10].set(5,
true);
823 if (! hitptn[i + 34]) wt[11].set(5,
true);
827 unsigned fastest0 = 0;
828 unsigned fastest1 = 0;
829 unsigned fastest2 = 0;
830 unsigned fastest3 = 0;
831 unsigned fastest4 = 0;
832 unsigned fastest5 = 0;
858 unsigned fastest10 = 0;
859 if (wt[fastest0] < wt[fastest1])
860 fastest10 = fastest0;
862 fastest10 = fastest1;
864 unsigned fastest11 = 0;
865 if (wt[fastest2] < wt[fastest3])
866 fastest11 = fastest2;
868 fastest11 = fastest3;
870 unsigned fastest12 = 0;
871 if (wt[fastest4] < wt[fastest5])
872 fastest12 = fastest4;
874 fastest12 = fastest5;
876 unsigned fastest101 = 0;
877 if (wt[fastest10] < wt[fastest11])
878 fastest101 = fastest10;
880 fastest101 = fastest11;
882 unsigned fastest102 = 0;
883 if (wt[fastest101] < wt[fastest12])
884 fastest102 = fastest101;
886 fastest102 = fastest12;
889 if (! wt[fastest102].active(5))
890 fastest = wt[fastest102].subset(0, 5);
924 TCFrontEnd::packerOuterInside(
const TRGState& input)
949 TRGState s(48 + 16 * 5 + 16 * 5 + 2 * 5 + 38);
952 bool* b =
new bool[input.size()];
956 const bool*
const hitptn = & b[0];
957 const bool*
const timing[48] = {
958 & b[48], & b[53], & b[58], & b[63],
959 & b[68], & b[73], & b[78], & b[83],
960 & b[88], & b[93], & b[98], & b[103],
961 & b[108], & b[113], & b[118], & b[123],
962 & b[128], & b[133], & b[138], & b[143],
963 & b[148], & b[153], & b[158], & b[163],
964 & b[168], & b[173], & b[178], & b[183],
965 & b[188], & b[193], & b[198], & b[203],
966 & b[208], & b[213], & b[218], & b[223],
967 & b[228], & b[233], & b[238], & b[243],
968 & b[248], & b[253], & b[258], & b[263],
969 & b[268], & b[273], & b[278], & b[283]
973 s.set(0, 48, hitptn);
977 for (
unsigned i = 0; i < 16; i++) {
978 s.set(p, 5, timing[32 + i]);
983 const bool dummy[6] = {
false,
false,
false,
false,
false,
true};
984 const TRGState wtDummy(6, dummy);
985 for (
unsigned i = 0; i < 18; i++) {
990 wt[1] = TRGState(5, timing[0]);
991 wt[2] = TRGState(5, timing[1]);
993 wt[4] = TRGState(5, timing[16]);
994 wt[5] = TRGState(5, timing[32]);
997 if (! hitptn[0]) wt[1].set(5,
true);
998 if (! hitptn[1]) wt[2].set(5,
true);
999 if (! hitptn[16]) wt[4].set(5,
true);
1000 if (! hitptn[32]) wt[5].set(5,
true);
1001 }
else if (i == 15) {
1002 wt[0] = TRGState(5, timing[14]);
1003 wt[1] = TRGState(5, timing[15]);
1005 wt[3] = TRGState(5, timing[30]);
1006 wt[4] = TRGState(5, timing[31]);
1007 wt[5] = TRGState(5, timing[47]);
1010 if (! hitptn[14]) wt[0].set(5,
true);
1011 if (! hitptn[15]) wt[1].set(5,
true);
1012 if (! hitptn[30]) wt[3].set(5,
true);
1013 if (! hitptn[31]) wt[4].set(5,
true);
1014 if (! hitptn[47]) wt[5].set(5,
true);
1015 }
else if (i == 16) {
1019 wt[2] = TRGState(5, timing[0]);
1024 if (! hitptn[0]) wt[2].set(5,
true);
1025 }
else if (i == 17) {
1026 wt[0] = TRGState(5, timing[15]);
1029 wt[3] = TRGState(5, timing[31]);
1034 if (! hitptn[15]) wt[0].set(5,
true);
1035 if (! hitptn[31]) wt[3].set(5,
true);
1037 wt[0] = TRGState(5, timing[i - 1]);
1038 wt[1] = TRGState(5, timing[i]);
1039 wt[2] = TRGState(5, timing[i + 1]);
1040 wt[3] = TRGState(5, timing[i + 15]);
1041 wt[4] = TRGState(5, timing[i + 16]);
1042 wt[5] = TRGState(5, timing[i + 32]);
1045 if (! hitptn[i - 1]) wt[0].set(5,
true);
1046 if (! hitptn[i]) wt[1].set(5,
true);
1047 if (! hitptn[i + 1]) wt[2].set(5,
true);
1048 if (! hitptn[i + 15]) wt[3].set(5,
true);
1049 if (! hitptn[i + 16]) wt[4].set(5,
true);
1050 if (! hitptn[i + 32]) wt[5].set(5,
true);
1054 unsigned fastest0 = 0;
1055 unsigned fastest1 = 0;
1056 unsigned fastest2 = 0;
1070 unsigned fastest3 = 0;
1071 if (wt[fastest0] < wt[fastest1])
1072 fastest3 = fastest0;
1074 fastest3 = fastest1;
1076 unsigned fastest4 = 0;
1077 if (wt[fastest2] < wt[fastest3])
1078 fastest4 = fastest2;
1080 fastest4 = fastest3;
1082 TRGState fastest(5);
1083 if (! wt[fastest4].active(5))
1084 fastest = wt[fastest4].subset(0, 5);
1105 TCFrontEnd::packerOuterOutside(
const TRGState& input)
1130 TRGState s(48 + 16 * 5 + 16 * 5 + 2 * 5 + 38);
1134 bool* b =
new bool[input.size()];
1138 const bool*
const hitptn = & b[0];
1139 const bool*
const timing[48] = {
1140 & b[48], & b[53], & b[58], & b[63],
1141 & b[68], & b[73], & b[78], & b[83],
1142 & b[88], & b[93], & b[98], & b[103],
1143 & b[108], & b[113], & b[118], & b[123],
1144 & b[128], & b[133], & b[138], & b[143],
1145 & b[148], & b[153], & b[158], & b[163],
1146 & b[168], & b[173], & b[178], & b[183],
1147 & b[188], & b[193], & b[198], & b[203],
1148 & b[208], & b[213], & b[218], & b[223],
1149 & b[228], & b[233], & b[238], & b[243],
1150 & b[248], & b[253], & b[258], & b[263],
1151 & b[268], & b[273], & b[278], & b[283]
1155 s.set(0, 48, hitptn);
1160 for (
unsigned i = 0; i < 16; i++) {
1161 s.set(p, 5, timing[i]);
1166 const bool dummy[6] = {
false,
false,
false,
false,
false,
true};
1167 const TRGState wtDummy(6, dummy);
1168 for (
unsigned i = 0; i < 18; i++) {
1173 wt[1] = TRGState(5, timing[0]);
1175 wt[3] = TRGState(5, timing[16]);
1176 wt[4] = TRGState(5, timing[17]);
1179 if (! hitptn[0]) wt[1].set(5,
true);
1180 if (! hitptn[16]) wt[3].set(5,
true);
1181 if (! hitptn[17]) wt[4].set(5,
true);
1182 }
else if (i == 15) {
1183 wt[0] = TRGState(5, timing[14]);
1184 wt[1] = TRGState(5, timing[15]);
1185 wt[2] = TRGState(5, timing[30]);
1186 wt[3] = TRGState(5, timing[31]);
1190 if (! hitptn[14]) wt[0].set(5,
true);
1191 if (! hitptn[15]) wt[1].set(5,
true);
1192 if (! hitptn[30]) wt[2].set(5,
true);
1193 if (! hitptn[31]) wt[3].set(5,
true);
1194 }
else if (i == 16) {
1199 wt[4] = TRGState(5, timing[16]);
1201 if (! hitptn[16]) wt[4].set(5,
true);
1202 }
else if (i == 17) {
1203 wt[0] = TRGState(5, timing[15]);
1205 wt[2] = TRGState(5, timing[31]);
1210 if (! hitptn[15]) wt[0].set(5,
true);
1211 if (! hitptn[31]) wt[2].set(5,
true);
1213 wt[0] = TRGState(5, timing[i - 1]);
1214 wt[1] = TRGState(5, timing[i]);
1215 wt[2] = TRGState(5, timing[i + 15]);
1216 wt[3] = TRGState(5, timing[i + 16]);
1217 wt[4] = TRGState(5, timing[i + 17]);
1220 if (! hitptn[i - 1]) wt[0].set(5,
true);
1221 if (! hitptn[i]) wt[1].set(5,
true);
1222 if (! hitptn[i + 15]) wt[2].set(5,
true);
1223 if (! hitptn[i + 16]) wt[3].set(5,
true);
1224 if (! hitptn[i + 17]) wt[4].set(5,
true);
1228 unsigned fastest0 = 0;
1229 unsigned fastest1 = 0;
1239 unsigned fastest2 = 0;
1240 if (wt[fastest0] < wt[fastest1])
1241 fastest2 = fastest0;
1243 fastest2 = fastest1;
1245 unsigned fastest3 = 0;
1246 if (wt[fastest2] < wt[4])
1247 fastest3 = fastest2;
1251 TRGState fastest(5);
1252 if (! wt[fastest3].active(5))
1253 fastest = wt[fastest3].subset(0, 5);
1274 TCFrontEnd::unpackerInnerInside(
const TRGState& input,
1275 const TRGState& output)
1278 cout <<
"Input bit size=" << input.size() << endl;
1280 cout <<
"Input : wire hit pattern" << endl;
1282 for (
unsigned i = 0; i < 48; i++) {
1283 const unsigned j = 48 - i - 1;
1284 if (i && ((i % 8) == 0))
1292 cout <<
"Input : wire hit timing" << endl;
1294 for (
unsigned i = 0; i < 48; i++) {
1295 TRGState s = input.subset(o + i * 5, 5);
1298 cout << i <<
": " << s <<
" ";
1303 cout <<
"Output bit size=" << output.size() << endl;
1305 cout <<
"Output : wire hit pattern" << endl;
1307 for (
unsigned i = 0; i < 32; i++) {
1308 const unsigned j = 32 - i - 1;
1309 if (i && ((i % 8) == 0))
1318 cout <<
"Output : priority cell timing" << endl;
1320 for (
unsigned i = 0; i < 16; i++) {
1321 TRGState s = output.subset(o + i * 5, 5);
1324 cout << i <<
": " << s <<
" ";
1329 cout <<
"Output : second priority cell position" << endl;
1332 for (
unsigned i = 0; i < 16; i++) {
1333 TRGState s = output.subset(o + i, 1);
1334 if (i && ((i % 8) == 0))
1343 cout <<
"Output : fastest timing" << endl;
1345 for (
unsigned i = 0; i < 16; i++) {
1346 TRGState s = output.subset(o + i * 5, 5);
1349 cout << i <<
": " << s <<
" ";
1354 cout <<
"Output : timing of missing wires" << endl;
1356 for (
unsigned i = 0; i < 1; i++) {
1357 TRGState s = output.subset(o + i * 5, 5);
1360 cout << i <<
": " << s <<
" ";
1369 TCFrontEnd::unpackerInnerOutside(
const TRGState& input,
1370 const TRGState& output)
1373 cout <<
"Input bit size=" << input.size() << endl;
1375 cout <<
"Input : wire hit pattern" << endl;
1377 for (
unsigned i = 0; i < 48; i++) {
1378 const unsigned j = 48 - i - 1;
1379 if (i && ((i % 8) == 0))
1387 cout <<
"Input : wire hit timing" << endl;
1389 for (
unsigned i = 0; i < 48; i++) {
1390 TRGState s = input.subset(o + i * 5, 5);
1393 cout << i <<
": " << s <<
" ";
1398 cout <<
"Output bit size=" << output.size() << endl;
1400 cout <<
"Output : wire hit pattern" << endl;
1402 for (
unsigned i = 0; i < 48; i++) {
1403 const unsigned j = 48 - i - 1;
1404 if (i && ((i % 8) == 0))
1413 cout <<
"Output : fastest timing" << endl;
1415 for (
unsigned i = 0; i < 16; i++) {
1416 TRGState s = output.subset(o + i * 5, 5);
1419 cout << i <<
": " << s <<
" ";
1424 cout <<
"Output : timing of missing wires" << endl;
1426 for (
unsigned i = 0; i < 4; i++) {
1427 TRGState s = output.subset(o + i * 5, 5);
1430 cout << i <<
": " << s <<
" ";
1439 TCFrontEnd::unpackerOuterInside(
const TRGState& input,
1440 const TRGState& output)
1443 cout <<
"Input bit size=" << input.size() << endl;
1445 cout <<
"Input : wire hit pattern" << endl;
1447 for (
unsigned i = 0; i < 48; i++) {
1448 const unsigned j = 48 - i - 1;
1449 if (i && ((i % 8) == 0))
1457 cout <<
"Input : wire hit timing" << endl;
1459 for (
unsigned i = 0; i < 48; i++) {
1460 TRGState s = input.subset(o + i * 5, 5);
1463 cout << i <<
": " << s <<
" ";
1468 cout <<
"Output bit size=" << output.size() << endl;
1470 cout <<
"Output : wire hit pattern" << endl;
1472 for (
unsigned i = 0; i < 48; i++) {
1473 const unsigned j = 48 - i - 1;
1474 if (i && ((i % 8) == 0))
1483 cout <<
"Output : priority cell timing" << endl;
1485 for (
unsigned i = 0; i < 16; i++) {
1486 TRGState s = output.subset(o + i * 5, 5);
1489 cout << i <<
": " << s <<
" ";
1494 cout <<
"Output : fastest timing" << endl;
1496 for (
unsigned i = 0; i < 16; i++) {
1497 TRGState s = output.subset(o + i * 5, 5);
1500 cout << i <<
": " << s <<
" ";
1505 cout <<
"Output : timing of missing wires" << endl;
1507 for (
unsigned i = 0; i < 2; i++) {
1508 TRGState s = output.subset(o + i * 5, 5);
1511 cout << i <<
": " << s <<
" ";
1520 TCFrontEnd::unpackerOuterOutside(
const TRGState& input,
1521 const TRGState& output)
1524 cout <<
"Input bit size=" << input.size() << endl;
1526 cout <<
"Input : wire hit pattern" << endl;
1528 for (
unsigned i = 0; i < 48; i++) {
1529 const unsigned j = 48 - i - 1;
1530 if (i && ((i % 8) == 0))
1538 cout <<
"Input : wire hit timing" << endl;
1540 for (
unsigned i = 0; i < 48; i++) {
1541 TRGState s = input.subset(o + i * 5, 5);
1544 cout << i <<
": " << s <<
" ";
1549 cout <<
"Output bit size=" << output.size() << endl;
1551 cout <<
"Output : wire hit pattern" << endl;
1553 for (
unsigned i = 0; i < 48; i++) {
1554 const unsigned j = 48 - i - 1;
1555 if (i && ((i % 8) == 0))
1564 cout <<
"Output : Second priority cell timing" << endl;
1566 for (
unsigned i = 0; i < 16; i++) {
1567 TRGState s = output.subset(o + i * 5, 5);
1570 cout << i <<
": " << s <<
" ";
1575 cout <<
"Output : fastest timing" << endl;
1577 for (
unsigned i = 0; i < 16; i++) {
1578 TRGState s = output.subset(o + i * 5, 5);
1581 cout << i <<
": " << s <<
" ";
1586 cout <<
"Output : timing of missing wires" << endl;
1588 for (
unsigned i = 0; i < 2; i++) {
1589 TRGState s = output.subset(o + i * 5, 5);
1592 cout << i <<
": " << s <<
" ";
1618 output <<
"InnerInside FrontEnd output dump" << endl << endl;
1621 std::vector<vector<int>> boolvector(changetime.size());
1622 for (
unsigned ch_t = 0; ch_t < changetime.size(); ch_t++) {
1624 for (
unsigned b = 0; b < (* _osb)[0]->size(); b++) {
1625 boolvector[ch_t].push_back(((*
_osb)[0]->state(changetime[ch_t])[b]) ? 1 : 0);
1628 output <<
"# of clk: " << changetime[ch_t] <<
" (" << dClock.
absoluteTime(changetime[ch_t]) <<
" ns), signal vector: " << endl;
1630 output <<
"Hitmap: " << endl ;
1631 for (
unsigned b = 0; b < 32; b++) {
1632 output << boolvector[ch_t][31 - b] <<
" " ;
1633 if (b == 15) output << endl <<
" ";
1637 for (
unsigned b = 0; b < 16; b++) {
1638 output <<
"PT#" << b <<
": " << boolvector[ch_t][ 32 + 5 * b + 4 ] << boolvector[ch_t][ 32 + 5 * b + 3 ] << boolvector[ch_t][ 32 + 5
1640 << boolvector[ch_t][ 32 + 5 * b + 1 ] << boolvector[ch_t][ 32 + 5 * b] << endl;
1644 output <<
"Secondary: ";
1645 for (
int b = 0; b < 16; b++) {
1646 output << boolvector[ch_t][ 127 - b ] ;
1650 for (
unsigned b = 0; b < 16; b++) {
1651 output <<
"FT#" << b <<
": " << boolvector[ch_t][ 128 + 5 * b + 4 ] << boolvector[ch_t][ 128 + 5 * b + 3 ] << boolvector[ch_t][ 128
1653 << boolvector[ch_t][ 128 + 5 * b + 1 ] << boolvector[ch_t][ 128 + 5 * b] << endl;
1657 output <<
"ET#0(cell 31): " << endl << boolvector[ch_t][212] << boolvector[ch_t][211] << boolvector[ch_t][210]
1658 << boolvector[ch_t][209] << boolvector[ch_t][208] << endl;
1675 output <<
"InnerOutside FrontEnd output dump" << endl << endl;
1678 std::vector<vector<int>> boolvector(changetime.size());
1679 for (
unsigned ch_t = 0; ch_t < changetime.size(); ch_t++) {
1681 for (
unsigned b = 0; b < (* _osb)[0]->size(); b++) {
1682 boolvector[ch_t].push_back(((*
_osb)[0]->state(changetime[ch_t])[b]) ? 1 : 0);
1685 output <<
"# of clk: " << changetime[ch_t] <<
" (" << dClock.
absoluteTime(changetime[ch_t]) <<
" ns), signal vector: " << endl;
1687 output <<
"Hitmap: " << endl <<
" ";
1688 for (
unsigned b = 0; b < 48; b++) {
1689 output << boolvector[ch_t][47 - b] <<
" ";
1690 if (b == 15) output << endl ;
1691 else if (b == 31) output << endl <<
" ";
1695 for (
unsigned b = 0; b < 16; b++) {
1696 output <<
"FT#" << b <<
": " << boolvector[ch_t][ 48 + 5 * b + 4 ] << boolvector[ch_t][ 48 + 5 * b + 3 ] << boolvector[ch_t][ 48 + 5
1698 << boolvector[ch_t][ 48 + 5 * b + 1 ] << boolvector[ch_t][ 48 + 5 * b] << endl;
1702 output <<
"ET#0(cell 32): " << endl << boolvector[ch_t][132] << boolvector[ch_t][131] << boolvector[ch_t][130]
1703 << boolvector[ch_t][129] << boolvector[ch_t][128] << endl;
1704 output <<
"ET#1(cell 0, 16, 32, 33): " << endl << boolvector[ch_t][137] << boolvector[ch_t][136] << boolvector[ch_t][135]
1705 << boolvector[ch_t][134] << boolvector[ch_t][133] << endl;
1706 output <<
"ET#0(cell 15, 30, 31, 46, 47): " << endl << boolvector[ch_t][142] << boolvector[ch_t][141] << boolvector[ch_t][140]
1707 << boolvector[ch_t][139] << boolvector[ch_t][138] << endl;
1708 output <<
"ET#3(cell 31, 47): " << endl << boolvector[ch_t][147] << boolvector[ch_t][146] << boolvector[ch_t][145]
1709 << boolvector[ch_t][144] << boolvector[ch_t][143] << endl;
1725 output <<
"OuterInside FrontEnd output dump" << endl << endl;
1728 std::vector<vector<int>> boolvector(changetime.size());
1729 for (
unsigned ch_t = 0; ch_t < changetime.size(); ch_t++) {
1731 for (
unsigned b = 0; b < (* _osb)[0]->size(); b++) {
1732 boolvector[ch_t].push_back(((*
_osb)[0]->state(changetime[ch_t])[b]) ? 1 : 0);
1735 output <<
"# of clk: " << changetime[ch_t] <<
" (" << dClock.
absoluteTime(changetime[ch_t]) <<
" ns), signal vector: " << endl;
1737 output <<
"Hitmap: " << endl <<
" ";
1738 for (
unsigned b = 0; b < 48; b++) {
1739 output << boolvector[ch_t][47 - b] <<
" " ;
1740 if (b == 15) output << endl;
1741 else if (b == 31) output << endl <<
" ";
1745 for (
unsigned b = 0; b < 16; b++) {
1746 output <<
"PT#" << b <<
": " << boolvector[ch_t][ 48 + 5 * b + 4 ] << boolvector[ch_t][ 48 + 5 * b + 3 ] << boolvector[ch_t][ 48 + 5
1748 << boolvector[ch_t][ 48 + 5 * b + 1 ] << boolvector[ch_t][ 48 + 5 * b] << endl;
1752 for (
unsigned b = 0; b < 16; b++) {
1753 output <<
"FT#" << b <<
": " << boolvector[ch_t][ 128 + 5 * b + 4 ] << boolvector[ch_t][ 128 + 5 * b + 3 ] << boolvector[ch_t][ 128
1755 << boolvector[ch_t][ 128 + 5 * b + 1 ] << boolvector[ch_t][ 128 + 5 * b] << endl;
1759 output <<
"ET#0(cell 0): " << endl << boolvector[ch_t][212] << boolvector[ch_t][211] << boolvector[ch_t][210]
1760 << boolvector[ch_t][209] << boolvector[ch_t][208] << endl;
1761 output <<
"ET#1(cell 15, 31): " << endl << boolvector[ch_t][217] << boolvector[ch_t][216] << boolvector[ch_t][215]
1762 << boolvector[ch_t][214] << boolvector[ch_t][213] << endl;
1778 output <<
"OuterOutside FrontEnd output dump" << endl << endl;
1780 std::vector<vector<int>> boolvector(changetime.size());
1781 for (
unsigned ch_t = 0; ch_t < changetime.size(); ch_t++) {
1783 for (
unsigned b = 0; b < (* _osb)[0]->size(); b++) {
1784 boolvector[ch_t].push_back(((*
_osb)[0]->state(changetime[ch_t])[b]) ? 1 : 0);
1787 output <<
"# of clk: " << changetime[ch_t] <<
" (" << dClock.
absoluteTime(changetime[ch_t]) <<
" ns), signal vector: " << endl;
1789 output <<
"Hitmap: " << endl;
1790 for (
unsigned b = 0; b < 48; b++) {
1791 output << boolvector[ch_t][47 - b] <<
" ";
1792 if (b == 15) output << endl <<
" ";
1793 else if (b == 31) output << endl ;
1797 for (
unsigned b = 0; b < 16; b++) {
1798 output <<
"PT#" << b <<
": " << boolvector[ch_t][ 48 + 5 * b + 4 ] << boolvector[ch_t][ 48 + 5 * b + 3 ] << boolvector[ch_t][ 48 + 5
1800 << boolvector[ch_t][ 48 + 5 * b + 1 ] << boolvector[ch_t][ 48 + 5 * b] << endl;
1804 for (
unsigned b = 0; b < 16; b++) {
1805 output <<
"FT#" << b <<
": " << boolvector[ch_t][ 128 + 5 * b + 4 ] << boolvector[ch_t][ 128 + 5 * b + 3 ] << boolvector[ch_t][ 128
1807 << boolvector[ch_t][ 128 + 5 * b + 1 ] << boolvector[ch_t][ 128 + 5 * b] << endl;
1811 output <<
"ET#0(cell 16): " << endl << boolvector[ch_t][212] << boolvector[ch_t][211] << boolvector[ch_t][210]
1812 << boolvector[ch_t][209] << boolvector[ch_t][208] << endl;
1813 output <<
"ET#1(cell 15, 31): " << endl << boolvector[ch_t][217] << boolvector[ch_t][216] << boolvector[ch_t][215]
1814 << boolvector[ch_t][214] << boolvector[ch_t][213] << endl;