4 #ifndef EMULATEDDEFECTSBUILDER_H
5 #define EMULATEDDEFECTSBUILDER_H
11 template <
typename T_ModuleHelper>
13 typename T_ModuleHelper::KEY_TYPE defect_type_key_component) {
22 if (defect_type_key_component < T_ModuleHelper::getDefectTypeComponent(*begin_range_iter)) {
27 *begin_range_iter = (*begin_range_iter & (~T_ModuleHelper::TYPE_MASK)) | defect_type_key_component;
32 template <
typename T_ModuleHelper>
33 typename T_ModuleHelper::KEY_TYPE
makeNextKey(
typename T_ModuleHelper::KEY_TYPE
key) {
34 return T_ModuleHelper::makeBaseKey(
key)+1;
36 template <
typename T_ModuleHelper>
37 typename T_ModuleHelper::KEY_TYPE
makePrevKey(T_ModuleHelper &
helper,
typename T_ModuleHelper::KEY_TYPE
key) {
55 return T_ModuleHelper::makeBaseKey(
key)-1;
70 template <
typename T_ModuleHelper>
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);
87 if (T_ModuleHelper::makeBaseKey(*
iter)>=prev_key) {
90 if (
next != module_defects.end() && T_ModuleHelper::isRangeKey(*
next)) {
95 *
iter = T_ModuleHelper::makeRangeKey(*
iter) ;
103 if (
iter != module_defects.begin()) {
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;
146 template <
typename T_ModuleHelper>
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) {
152 return insertKey<T_ModuleHelper>(
helper, module_defects, key_range.first, defect_type_key_component);
155 auto [key_start,key_end ] = key_range;
156 if (key_end < key_start) {
164 if (
helper.getRow(key_start)==0
u &&
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
187 if (
next != end_iter && T_ModuleHelper::isRangeKey(*
next)) {
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;
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) {
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);
251 module_defects.insert(
iter,key_end | defect_type_key_component );