⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hyperlynx-4_11.ulp

📁 老外的PCB设计软件,是免费的.可以上网更新.
💻 ULP
📖 第 1 页 / 共 5 页
字号:
                  int apad_dril ) {

  int fnd = search_A_Pad( apad_type, apad_layer, apad_shape_Top_rnds, apad_shape_Inner, apad_shape_Bott, apad_angle_end, apad_dx_Top, apad_dx_Inner, apad_dx_Bott, apad_dy_elong_start, apad_dril);
  if (fnd < 0) {
    Total_Pads++;
    pad_type[Total_Pads]               = apad_type;
    pad_layer[Total_Pads]              = apad_layer;
    pad_shape_Top_rnds[Total_Pads]     = apad_shape_Top_rnds;
    pad_shape_Inner[Total_Pads]        = apad_shape_Inner;
    pad_shape_Bott[Total_Pads]         = apad_shape_Bott;
    pad_angle_end[Total_Pads]          = apad_angle_end;
    pad_diameter_Top_or_dx[Total_Pads] = apad_dx_Top;
    pad_diameter_Inner[Total_Pads]     = apad_dx_Inner;
    pad_diameter_Bott[Total_Pads]      = apad_dx_Bott;
    pad_dy_elong_start[Total_Pads]     = apad_dy_elong_start;
    pad_drill[Total_Pads]              = apad_dril;
  }
  return;
}

// This routine finds a pad of a known type and size and returns the ID
// of the pad (internal number) that is used to identify the pad.
int Find_A_Pad( int apad_type, int apad_layer,
                int apad_shape_Top_rnds, int apad_shape_Inner, int apad_shape_Bott,
                real apad_angle_end,
                int apad_dx_Top, int apad_dx_Inner, int apad_dx_Bott,
                int apad_dy_elong_start,
                int apad_dril ) {
  int fnd = search_A_Pad( apad_type, apad_layer, apad_shape_Top_rnds, apad_shape_Inner, apad_shape_Bott, apad_angle_end, apad_dx_Top, apad_dx_Inner, apad_dx_Bott, apad_dy_elong_start, apad_dril);
  return( fnd );
}

// This routine finds the HyperLynx shape form of eagle shape
int SmdRoundness(int r) {
  if (r == 100) return 0;   // oval or round
  if (r == 0)   return 1;   // rect or square
  return 2;                 // oblong
}


// Insert a pin on in a list of associated connected contacts
int AssPinCount = 0;  // Number of associated Contacts
string AssTabEname[];  // Element Name
string AssTabCname[];  // Contact Name
int AssTabLenEname[];  // Element Name Length
int AssTabLenCname[];  // Contact Name Length
int InsertAssocatedPin( string ename, string cname ) {
  int lenofename,lenofcname;
  lenofename = strlen(ename);
  lenofcname = strlen(cname);
  if ( AssPinCount > 0 ) {
    for ( int i = 0; i < AssPinCount; i++ ) {
      if ( lenofename == AssTabLenEname[i] )
        if ( lenofcname == AssTabLenCname[i] )
          if ( strstr( AssTabEname[i], ename ) != -1 )
            if ( strstr( AssTabCname[i], cname ) != -1 ) return( AssPinCount );
    }
  }
  AssTabEname[AssPinCount] = ename;
  AssTabCname[AssPinCount] = cname;
  AssTabLenEname[AssPinCount] = lenofename;
  AssTabLenCname[AssPinCount] = lenofcname;
  AssPinCount++;
  return( AssPinCount );
}

int FindAssocatedPin( string ename, string cname ) {
  int lenofename,lenofcname;
  lenofename = strlen(ename);
  lenofcname = strlen(cname);
  if ( AssPinCount > 0 ) {
    for ( int i = 0; i < AssPinCount; i++ ) {
      if ( lenofename == AssTabLenEname[i] )
        if ( lenofcname == AssTabLenCname[i] )
          if ( strstr( AssTabEname[i], ename ) != -1 )
            if ( strstr( AssTabCname[i], cname ) != -1 ) return( AssPinCount );
    }
  }
  return( 0 );
}

// write a divider
void printdivider( void ) {
  printf("**********************************************************************\n");
  return;
}

// write a section header with dividers
void printheader(string hs) {
  printdivider();
  printf("* %s\n*\n",hs);
  return;
}

// write translated package types from Eagle to Hyperlynx
int saypackagetype(string pn) {
  if ( strstr( pn,"TSSOP" ) != -1 ) {
    printf(" PKG=TSSOP");
  }
  else if ( strstr( pn,"TQFP" ) != -1 ) {
    printf(" PKG=TQFP");
  }
  else if ( strstr( pn,"SSOP" ) != -1 ) {
    printf(" PKG=SSOP");
  }
  else if ( strstr( pn,"PLCC" ) != -1 ) {
    printf(" PKG=PLCC");
  }
  else if ( strstr( pn,"LCC" ) != -1 ) {
    printf(" PKG=LCC");
  }
  else if ( strstr( pn,"DIP" ) != -1 ) {
    printf(" PKG=DIP");
  }
  else if ( strstr( pn,"QFP" ) != -1 ) {
    printf(" PKG=QFP");
  }
  else if ( strstr( pn,"BGA" ) != -1 ) {
    printf(" PKG=BGA");
  }
  else if ( strstr( pn,"PGA" ) != -1 ) {
    printf(" PKG=PGA");
  }
  else if ( strstr( pn,"DIL" ) != -1 ) {
    printf(" PKG=DIP");
  }
  else if ( strstr( pn,"DIP" ) != -1 ) {
    printf(" PKG=DIP");
  }
  else if ( strstr( pn,"SO" ) != -1 ) {
    printf(" PKG=SO");
  }
  else return( no );  // no package type recognized
  return( yes );      // yes, package recognized
}


// truncate trailing zeros and print value
void TruncateTrailingZeros( real value, int prec ) {
  string num;
  int nlen;
  sprintf( num, "%1.*f", prec, value );
  nlen = strlen( num );
  if ( nlen > 0 ) {
    while ( num[ nlen-1 ] == '0' ) {
      // truncate with a null
      num[ nlen-1 ] = 0;
      // recalc string length
      nlen = strlen( num );
      if ( nlen == 0 )  break;
    }
  }
  printf("%s",num);
  return;
}

// Convert Capacitor Values. i.e. change ".1" to ".1u"
// char ConvertCapValues = yes;
// Cap value conversion rules for values without suffix multipliers
// string ConvertLT1to = "u";    // values less than 1 are "u" or "something else"
// string ConvertGE1to = "u";    // convert greater than or equal to 1 as "u" or "p"
//
void ConvertCapValue( string capvalue ) {
  char cstate;    // state machine
  char clabel;    // unit label
  real cvalue;    // the value of the capacitor
  int lenofcapvalue;  // length of the string for parsing

  if ( ConvertCapValues == yes ) {
    cvalue = strtod( capvalue );
    if ( cvalue != 0.0 ) {
      lenofcapvalue = strlen( capvalue );
      cstate = 1; // set state for searching digits
      for ( int i=0; i<lenofcapvalue; i++ ) {
        clabel = capvalue[ i ];
        if ( isdigit( clabel ) || ( clabel == '.' ) ) {
          cstate = 2; // digits found
        }
        else {
          clabel = toupper( clabel );
          if ( strchr( "FMUPN", clabel ) != -1 ) cstate = 3; // multiplier found
          break;
        }
      }
      // If the value NOT labeled with a multiplier, then label it
      if ( cstate == 1 ) {
        // report error for debugging purposes
        printf("***no digits found***");
      }
      if ( cstate == 2 ) {
        if ( cvalue < 1.0 ) {
          TruncateTrailingZeros( cvalue, 6 );
          printf("%s",ConvertLT1to);
        } else {
          TruncateTrailingZeros( cvalue, 6 );
          printf("%s",ConvertGE1to);
        }
        return;
      }
      if ( cstate == 3 ) {
        if ( clabel == 'M' ) {
          TruncateTrailingZeros( cvalue, 6 );
          printf("uF");
          return;
        }
      }
    }
  }
  printf( "%s", capvalue );
  return;
}

// Search and Translate pin direction information if available and enabled
void SayUPinFunction( string Ptname, string Paname ) {
  int lofs1, lofs2;
  string ipadname;

  // check if search allowed
  if ( GeneratePinDirection == no ) return;

  // part name must begin with either IC or U
  if ( ( strstr( Ptname, "IC" ) == 0 ) || ( strstr( Ptname, "U" ) == 0 ) ) {
    if ( project.schematic ) {
      project.schematic(SCH) {
        SCH.parts(PT) {
          lofs1 = strlen( Ptname );
          lofs2 = strlen( PT.name );
          if ( lofs1 == 0 ) return;
          if ( lofs1 == lofs2 ) {
            if ( strstr( PT.name, Ptname ) == 0 ) {
              PT.instances(I) {
                I.gate.symbol.pins(PIN) {
                  if ( PIN.contact.pad ) ipadname = PIN.contact.pad.name;
                  if ( PIN.contact.smd ) ipadname = PIN.contact.smd.name;
                  lofs1 = strlen( ipadname );
                  lofs2 = strlen( Paname );
                  if ( lofs1 == 0 ) return;
                  if ( lofs1 == lofs2 ) {
                    if ( strstr( ipadname, Paname ) == 0 ) {
                      switch ( PIN.direction ) {
                          case PIN_DIRECTION_OUT:
                          case PIN_DIRECTION_OC:
                          case PIN_DIRECTION_HIZ:
                                      printf(" F=SIM_OUT");
                                      break;
                          case PIN_DIRECTION_IO:
                                      printf(" F=SIM_BOTH");
                                      break;
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return;
}



// ***************************************************************************
// board
//
// This is the MAIN() function of this ULP

if (board) board(B) {
  if ( GenerateReferenceFile == yes ) {
    output( filesetext( B.name, ".REF" ) ) {
      printdivider();
      printf("%s", usage);
      printf("* %s\n*\n", Version);
      printf("* %s\n*\n", EAGLE_SIGNATURE);
      printf("* HyperLynx Board exported from:\n");
      printf("* %s\n", B.name);
      printf("* At %s\n*\n", t2string(time()));
      if (project.schematic) {
        printf("* Schematic is loaded.\n");
      }
      else {
        printf("* Schematic NOT is loaded.\n");
      }
      printf("*\n*\n");

      // Generate the cross references
      printheader("Auto Mapped Reference File for ICs and Us");
      int unknownIC, ICstate, ICvaluelen, ICccnt;
      string ICname, ICvalue, ICpn, ICreflib;
      B.elements(E) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -