Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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);
  }
}
Esempio n. 7
0
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;
}