📄 hyperlynx-4_11.ulp
字号:
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 + -