37 typename T_ModuleHelper::KEY_TYPE
makePrevKey(T_ModuleHelper &helper,
typename T_ModuleHelper::KEY_TYPE key) {
38 unsigned int row = helper.getRow(key);
40 if (helper.getColumn(key)>0) {
41 return helper.makeKey(
false, helper.getChip(key), helper.getColumn(key)-1, helper.rowsPerCircuit()-1);
43 else if (helper.getChip(key)>0) {
44 return helper.makeKey(
false, helper.getChip(key)-1, helper.columnsPerCircuit()-1, helper.rowsPerCircuit()-1);
51 if (row >= helper.rowsPerCircuit()) {
52 return helper.makeKey(
false, helper.getChip(key), helper.getColumn(key), helper.rowsPerCircuit()-1);
55 return T_ModuleHelper::makeBaseKey(key)-1;
72 std::vector< typename T_ModuleHelper::KEY_TYPE> &module_defects,
73 typename T_ModuleHelper::KEY_TYPE key,
74 typename T_ModuleHelper::KEY_TYPE defect_type_key_component) {
76 if (iter != module_defects.end() ) {
80 if ((T_ModuleHelper::isRangeKey(*iter) || T_ModuleHelper::makeBaseKey(*iter)==key))
return treatAsInserted<T_ModuleHelper>(iter,defect_type_key_component);
84 typename T_ModuleHelper::KEY_TYPE prev_key =
makePrevKey(helper,key);
87 if (T_ModuleHelper::makeBaseKey(*iter)>=prev_key) {
90 if (next != module_defects.end() && T_ModuleHelper::isRangeKey(*next)) {
92 iter = module_defects.erase( iter);
95 *iter = T_ModuleHelper::makeRangeKey(*iter) ;
103 if (iter != module_defects.begin()) {
106 typename T_ModuleHelper::KEY_TYPE prev_key =
makePrevKey(helper,*prev);
107 if (T_ModuleHelper::makeBaseKey(prev_key) == key) {
110 if (T_ModuleHelper::isRangeKey(*prev)) {
111 if (iter == module_defects.end() || !T_ModuleHelper::isRangeKey(*iter)) {
114 *prev = T_ModuleHelper::makeRangeKey(key) | T_ModuleHelper::getDefectTypeComponent(*prev);
120 module_defects.erase(prev);
124 else if (iter != module_defects.end() && T_ModuleHelper::isRangeKey(*iter)) {
129 key=T_ModuleHelper::makeRangeKey(key) | T_ModuleHelper::getDefectTypeComponent(*prev);
132 if constexpr(T_ModuleHelper::TYPE_BITS>0) {
135 if (!T_ModuleHelper::getDefectTypeComponent(key)) {
136 key |= defect_type_key_component;
142 iter = module_defects.insert(iter,key);
148 std::vector< typename T_ModuleHelper::KEY_TYPE> &module_defects,
149 const std::pair<typename T_ModuleHelper::KEY_TYPE, typename T_ModuleHelper::KEY_TYPE> &key_range,
150 typename T_ModuleHelper::KEY_TYPE defect_type_key_component) {
151 if (key_range.first == key_range.second) {
155 auto [key_start,key_end ] = key_range;
156 if (key_end < key_start) {
159 if (helper.getRow(key_end)+1u==helper.rowsPerCircuit()) {
162 key_end = helper.makeKey(
false, helper.getChip(key_end), helper.getColumn(key_end), helper.getLimitRowMax());
164 if (helper.getRow(key_start)==0u && helper.getColumn(key_start)>0) {
165 key_start = helper.makeKey(
false, helper.getChip(key_start), helper.getColumn(key_start)-1, helper.rowsPerCircuit());
179 bool is_range = (iter != end_iter && T_ModuleHelper::isRangeKey(*iter));
180 bool inserted_something=
false;
183 if (iter != end_iter && ( T_ModuleHelper::makeBaseKey(*iter) == key_start
184 || T_ModuleHelper::makeBaseKey(*iter) >=
makePrevKey(helper,key_start))) {
187 if (next != end_iter && T_ModuleHelper::isRangeKey(*next)) {
190 iter = module_defects.erase(iter);
193 if (T_ModuleHelper::makeBaseKey(*iter) == key_start) {
194 if ( defect_type_key_component > helper.getDefectTypeComponent(*iter)) {
195 *iter = (*iter & (~T_ModuleHelper::TYPE_MASK)) | defect_type_key_component;
199 if (helper.getRow(*iter)==0u && helper.getColumn(*iter)>0) {
201 *iter = helper.makeKey(
true, helper.getChip(*iter), helper.getColumn(*iter)-1, helper.rowsPerCircuit()) | helper.getDefectTypeComponent(*iter);
204 *iter = T_ModuleHelper::makeRangeKey(*iter);
209 iter = module_defects.insert(iter,T_ModuleHelper::makeRangeKey(key_start) | defect_type_key_component);
211 inserted_something=
true;
216 while (iter != module_defects.begin()) {
220 if (T_ModuleHelper::makeBaseKey(*iter) >= key_end) {
226 if (is_range || T_ModuleHelper::makeBaseKey(*iter) == key_end ||
makePrevKey(helper,*iter) <= key_end) {
229 inserted_something |= ( T_ModuleHelper::makeBaseKey(*iter) > key_end ) && (!is_range || defect_type_key_component > helper.getDefectTypeComponent(*iter)) ;
231 if (T_ModuleHelper::isRangeKey(*iter)) {
232 module_defects.erase(iter);
235 if (T_ModuleHelper::makeBaseKey(*iter) == key_end) {
236 if ( defect_type_key_component > helper.getDefectTypeComponent(*iter)) {
237 *iter = (*iter & (~T_ModuleHelper::TYPE_MASK)) | defect_type_key_component;
241 return inserted_something;
247 is_range=T_ModuleHelper::isRangeKey(*iter);
249 iter=module_defects.erase(iter);
251 module_defects.insert(iter,key_end | defect_type_key_component );