static int pad_pin_data_cmp_by_number(const void* va, const void* vb) { const ElementPadPinData* a = (const ElementPadPinData*)va; const ElementPadPinData* b = (const ElementPadPinData*)vb; return pad_or_pin_number_cmp(&a->pp, &b->pp); }
bool have_any_corresponding_pad_or_pin (ElementType *old_element, ElementType *new_element, PadOrPinType* old_pp, PadOrPinType* new_pp) { PAD_OR_PIN_LOOP_HYG(old_element, _old); { PAD_OR_PIN_LOOP_HYG(new_element, _new); { if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0) { if (old_pp) { *old_pp = pp_old; } if (new_pp) { *new_pp = pp_new; } return true; } } END_LOOP; } END_LOOP; return false; }
static bool have_two_corresponding_aux (ElementType *old_element, ElementType *new_element, bool unique, bool non_coincident, PadOrPinType* old1_pp_ptr, PadOrPinType* old2_pp_ptr, PadOrPinType* new1_pp_ptr, PadOrPinType* new2_pp_ptr) { PadOrPinType old1_pp = make_pad_or_pin(NULL, NULL); PadOrPinType new1_pp = make_pad_or_pin(NULL, NULL); bool first_found = false; PAD_OR_PIN_LOOP_HYG(old_element, _old); { if (! unique || is_number_unique(old_element, pad_or_pin_number(&pp_old))) { CheapPointType old_pt = pad_or_pin_center(&pp_old); PAD_OR_PIN_LOOP_HYG(new_element, _new); { if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0 && (! unique || is_number_unique(new_element, pad_or_pin_number(&pp_new)))) { CheapPointType new_pt = pad_or_pin_center(&pp_new); if (! non_coincident || point_distance2(old_pt, new_pt)) { if (! first_found) { old1_pp = pp_old; new1_pp = pp_new; first_found = true; } else { if (old1_pp_ptr) { *old1_pp_ptr = old1_pp; } if (new1_pp_ptr) { *new1_pp_ptr = new1_pp; } if (old2_pp_ptr) { *old2_pp_ptr = pp_old; } if (new2_pp_ptr) { *new2_pp_ptr = pp_new; } return true; } } } } END_LOOP; } } END_LOOP; return false; }
static Boolean find_number_block(const ElementPadPinData* ppd, int len, const PadOrPinType* pp, int* start, int* end) { int i; for (i = 0; i < len; i++) { if (pad_or_pin_number_cmp(&ppd[i].pp, pp) == 0) { int j; for (j = i + 1; j < len; j++) { if (pad_or_pin_number_cmp(&ppd[j].pp, pp) != 0) { break; } } *start = i; *end = j; return True; } } return False; }
ElementPadPinData* alloc_pad_pin_data_array(ElementTypePtr element, int* len_ptr) { int len = element->PadN + element->PinN; ElementPadPinData* ppd = MyCalloc(len, sizeof(ElementPadPinData), "alloc_pad_pin_data_array"); /* Set the pad/pin pointers and centers */ int i = 0; PAD_OR_PIN_LOOP(element); { ppd[i].pp = pp; ppd[i].center = ppd[i].transformed_center = pad_or_pin_center(&pp); i++; } END_LOOP; /* Sort by pad/pin number */ qsort(ppd, len, sizeof(ElementPadPinData), pad_pin_data_cmp_by_number); /* Set the shared field */ int i_start = 0; const PadOrPinType* pp_start = &ppd[0].pp; /* Index i goes all the way to len; watch out. */ for (i = 1; i < len + 1; i++) { if (i == len || pad_or_pin_number_cmp(pp_start, &ppd[i].pp) != 0) { int shares = i - i_start; int j; for (j = i_start; j < i; j++) { ppd[j].shares = shares; } /* Prepare for next block */ if (i != len) { i_start = i; pp_start = &ppd[i].pp; } } } *len_ptr = len; return ppd; }
static void transfer_flags(ElementTypePtr old_element, ElementTypePtr new_element) { PAD_OR_PIN_LOOP_HYG(old_element, _old); { if (pad_or_pin_test_flag(&pp_old, SELECTEDFLAG)) { PAD_OR_PIN_LOOP_HYG(new_element, _new); { if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0) { pad_or_pin_set_flag(&pp_new, SELECTEDFLAG); } } END_LOOP; } } END_LOOP; if (TEST_FLAG(SELECTEDFLAG, old_element)) { SET_FLAG(SELECTEDFLAG, new_element); } }
static void transfer_names(ElementTypePtr old_element, ElementTypePtr new_element) { PAD_OR_PIN_LOOP_HYG(old_element, _old); { const char* old_name = pad_or_pin_name(&pp_old); PAD_OR_PIN_LOOP_HYG(new_element, _new); { if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0) { if (pp_new.pad) { MYFREE(pp_new.pad->Name); pp_new.pad->Name = MyStrdup((char*)old_name, "transfer_names()"); } else if (pp_new.pin) { MYFREE(pp_new.pin->Name); pp_new.pin->Name = MyStrdup((char*)old_name, "transfer_names()"); } } } END_LOOP; } END_LOOP; }