114{
115 if(orChannel) return nullptr;
116 if(hpbin->isValid()==false) return nullptr;
117
118 TGCChannelSLBOut* slbout = nullptr;
119
120
121 TGCModuleId* hpb = hpbin->getModule();
122
123
124 if(!hpb) return nullptr;
125
126
128 delete hpb;
129 if(!mapId) return nullptr;
130
131
133 if(numOfBlock==0) {
134 delete mapId;
135 mapId = nullptr;
136 return nullptr;
137 }
138
140 int slbInBlock = 0;
141
142
143 TGCModuleId* slb = nullptr;
144 int blockInHPB = 0;
145 int nSlb = 0;
146 int port = 0;
147
148
149 int blockInSlb = 0;
150 int posInHpb = 0;
152 int size = 0;
153 switch(moduleType){
154
157 slbInBlock = 3;
158 blockInHPB = hpbin->getBlock();
159 nSlb = hpbin->getChannel()/(numOfBlock*2);
160 port = blockInHPB*slbInBlock+nSlb;
161 size = mapId->size();
162 for(
int i=0;
i<size;
i++){
163 if(mapId->connector(i)==port){
164 slb = mapId->popModuleId(i);
165 break;
166 }
167 }
168 blockInSlb = (hpbin->getChannel() - nSlb*(numOfBlock*2))/2;
169 posInHpb = (hpbin->getChannel() - (numOfBlock*2)*nSlb)%2;
170 channel = (chInBlock/2)*posInHpb;
171 break;
172
174 slbInBlock = 2;
175 blockInHPB = hpbin->getBlock();
176 nSlb = hpbin->getChannel()/(numOfBlock*2);
177 port = blockInHPB*slbInBlock+nSlb;
178 size = mapId->size();
179 for(
int i=0;
i<size;
i++){
180 if(mapId->connector(i)== -1*port){
181 slb = mapId->popModuleId(i);
182 break;
183 }
184 }
185 blockInSlb = (hpbin->getChannel() - nSlb*(numOfBlock*2))/2;
186 posInHpb = (hpbin->getChannel() - (numOfBlock*2)*nSlb)%2;
187 channel = (chInBlock/2)*posInHpb;
188 break;
189
191 blockInHPB = hpbin->getBlock();
192 if(blockInHPB==0 && hpbin->getChannel()<numOfBlock) port=1;
193 else port=2;
194 size = mapId->size();
195 for(
int i=0;
i<size;
i++){
196 if(mapId->connector(i)== -1*port){
197 slb = mapId->popModuleId(i);
198 break;
199 }
200 }
201 blockInSlb = (hpbin->getChannel())%numOfBlock;
202 if(blockInHPB == 1 && hpbin->getChannel() >= numOfBlock) blockInSlb = blockInSlb + numOfBlock/2;
204 break;
205
206 default:
207 break;
208
209 }
210
211 delete mapId; mapId = nullptr;
212 if(!slb) return nullptr;
213
216
217 int SLBID = slb->getId();
218 if((chInBlock*blockInSlb+channel)>chInBlock*numOfBlock){
219 SLBID++;
221 blockInSlb = 0;
222 } else if( channel > chInBlock){
224 blockInSlb++;
225 }
226
227 slbout = new TGCChannelSLBOut(slb->getSideType(),
228 moduleType,
229 slb->getRegionType(),
230 slb->getSector(),
231 SLBID,
232 blockInSlb,
233 channel );
234
235 delete slb;
236 return slbout;
237}
virtual TGCModuleMap * getModuleInforHPB(const TGCModuleId *hpb, TGCId::ModuleType moduleType) const