📄 hyperlynx-4_11.ulp
字号:
// parse reference designators?
if ( UseComponentTypes == yes ) {
if ( strstr( componentname, "IC" ) == 0 ) {
if ( isdigit( componentname[2] ) ) {
printf("(IC REF=%s NAME=%s L=%s",componentname,componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
saypackagetype(E.package.name);
unknowncomponenttype = no;
}
}
else if ( strstr( componentname, "BD" ) == 0 ) {
if ( isdigit( componentname[2] ) ) {
printf("(BD REF=%s NAME=%s L=%s",componentname,componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
}
else if ( strstr( componentname, "BEAD" ) == 0 ) {
if ( isdigit( componentname[4] ) ) {
printf("(BD REF=%s NAME=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
}
else if ( isdigit( componentname[1] ) ) {
if ( strchr( componentname, 'U' ) == 0 ) {
printf("(IC REF=%s NAME=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
saypackagetype(E.package.name);
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'C' ) == 0 ) {
printf("(C REF=%s VAL=",componentname);
ConvertCapValue(componentvalue);
printf(" L=%s",E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'R' ) == 0 ) {
printf("(R REF=%s VAL=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'L' ) == 0 ) {
printf("(L REF=%s VAL=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'D' ) == 0 ) {
printf("(CR REF=%s NAME=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'J' ) == 0 ) {
printf("(J REF=%s NAME=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'Q' ) == 0 ) {
printf("(J REF=%s NAME=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
else if ( strchr( componentname, 'T' ) == 0 ) {
printf("(J REF=%s NAME=%s L=%s",componentname, componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
unknowncomponenttype = no;
}
}
}
// handle unknown component types
if ( ( unknowncomponenttype == yes ) || ( UseComponentTypes == no ) ) {
printf("(? REF=%s NAME=%s L=%s",componentname,componentvalue,
E.mirror ? LayerNames[16] : LayerNames[1] );
saypackagetype(E.package.name);
}
// append comment field
printf(") R%03.0f X=%5.*f Y=%5.*f : ",E.angle,precision_of_nets,u2inch(E.x),
precision_of_nets,u2inch(E.y) );
printf(" Lib: %s : %s : ", E.package.library, E.package.name);
printf("Pins %d", pincount);
printf("\n");
}
printf("}\n\n");
// PADSTACK CREATION OF PADS, SMDS, AND VIAS
// create list of all the different pads and smds (vias are pads)
printheader("Pads, Smds, and Via Library");
// handle all net contacts and vias
B.signals(S) {
S.vias(V) {
Insert_A_Pad( ISAPAD, ISAVIA,
V.shape[1], V.shape[2], V.shape[16],
V.end,
V.diameter[1], V.diameter[2], V.diameter[16],
V.start, V.drill );
}
}
// handle all package pins
B.elements(E) {
E.package.contacts(C) {
if (C.pad) {
Insert_A_Pad( ISAPAD, ISAPAD,
C.pad.shape[1], C.pad.shape[2], C.pad.shape[16],
C.pad.angle,
C.pad.diameter[1], C.pad.diameter[2], C.pad.diameter[16],
C.pad.elongation,
C.pad.drill );
}
if (C.smd) {
Insert_A_Pad( ISASMD, C.smd.layer,
SmdRoundness(C.smd.roundness), 0, 0,
C.smd.angle,
C.smd.dx, 0, 0,
C.smd.dy,
0 );
}
}
}
// write out sorted list of the pads and smds
if (Total_Pads) {
/* *** Hyperlynx documentation *************************************
{PADSTACK=padstack_name, // ** maximum of 32 characters an cnnot contain white space
[drill_size]
(layer_name,
pad_shape, // '0' means oval or round (pad_sx=pad_sy if round)
// '1' means rectangular or square (pad_sx=pad_sy if square)
// '2' means oblong (oblong shape is a rectangular with rounded corners)
pad_sx,
pad_sy,
pad_angle, // is the counter-clockwise rotation angle of the pad in degree;
// rotation angle can range from 0.0 to +/-359.999;
// valid angular resolution is 0.001 degree;
// 0 (without a decimal point) is th recommended way of specifying 'no rotation'
[thermal_clear_shape],
[thermal_clear_sx],
[thermal_clear_sy],
[thermal_clear_angle],
[pad_type])
***************************************************************** */
string s;
for (int i = 0; i < Total_Pads; i++) {
if (pad_layer[i] == 0) s = "ISAPAD";
if (pad_layer[i] == 1 || pad_layer[i] == 16) s = "ISASMD";
if (pad_layer[i] == 18) s = "ISAVIA";
if (pad_type[i] == ISASMD) {
printf("{PADSTACK=SMD%03d\n",i+1);
// smds are square, round or oblong
// * if you wish layer name for layer number remark *
// * this next 2 lines und mark the second 2 lines *
// printf("(%s,%d,%5.*f,%5.*f,%.1f) Shape was Smd and is now Smd\n",
// LayerNames[pad_layer[i]], // Layer name
printf("(%d,%d,%5.*f,%5.*f,%.1f) %s Shape was Smd and is now Smd\n",
pad_layer[i], // Layer number
pad_shape_Top_rnds[i],
precision_of_pads, u2inch(pad_diameter_Top_or_dx[i]),
precision_of_pads, u2inch(pad_dy_elong_start[i]),
pad_angle_end[i],
s );
}
else {
/* *** HyperLynx Signal-Integrity Transfer Format ******
{PADSTACK=padstack_name, [drill_size]
(layer_name, pad_shape, pad_sx, pad_sy, pad_angle,
[thermal_clear_shape],
[thermal_clear_sx],
[thermal_clear_sy],
[thermal_clear_angel],
[pad_type]) [comment]
** [pad_type]!M=metal-pad A=anti-pad **
******* HyperLynx Signal-Integrity Transfer Format *** */
printf("{PADSTACK=THR%03d,%5.3f\n",i+1, u2inch(pad_drill[i]));
// pads are on all layers, and have various shapes
if (pad_layer[i] == ISAPAD) {
// Pad layer Top
if (pad_shape_Top_rnds[i] == OBLONG) {
printf("(1,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n",
PadShapes[pad_shape_Top_rnds[i]],
precision_of_pads,u2inch(pad_diameter_Top_or_dx[i] * pad_dy_elong_start[i]),
precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]),
pad_angle_end[i],
s,
EaglePadShapes[pad_shape_Top_rnds[i]],
HypPadShapes[pad_shape_Top_rnds[i]] );
}
else { // OVALROUND or RECTSQUARE
printf("(1,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n",
PadShapes[pad_shape_Top_rnds[i]],
precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]),
precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]),
pad_angle_end[i],
s,
EaglePadShapes[pad_shape_Top_rnds[i]],
HypPadShapes[pad_shape_Top_rnds[i]] );
}
// Pad layer Inner
printf("(MDEF,%s,%5.*f,%5.*f,0) %s\n",
PadShapes[pad_shape_Inner[i]],
precision_of_pads,u2inch(pad_diameter_Inner[i]),
precision_of_pads,u2inch(pad_diameter_Inner[i]),
s);
// Pad layer Bottom
if (pad_shape_Bott[i] == OBLONG) {
printf("(16,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n",
PadShapes[pad_shape_Bott[i]],
precision_of_pads,u2inch(pad_diameter_Bott[i] * pad_dy_elong_start[i]),
precision_of_pads,u2inch(pad_diameter_Bott[i]),
pad_angle_end[i],
s,
EaglePadShapes[pad_shape_Bott[i]],
HypPadShapes[pad_shape_Bott[i]]);
}
else { // OVALROUND or RECTSQUARE
printf("(16,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n",
PadShapes[pad_shape_Bott[i]],
precision_of_pads,u2inch(pad_diameter_Bott[i]),
precision_of_pads,u2inch(pad_diameter_Bott[i]),
pad_angle_end[i],
s,
EaglePadShapes[pad_shape_Bott[i]],
HypPadShapes[pad_shape_Bott[i]]);
}
}
else if (pad_layer[i] == ISAVIA) {
// Top - Inner(schleife) - Bottom
for (int vlay = pad_dy_elong_start[i]; vlay <= pad_angle_end[i]; vlay++) {
// layer used and allowed?
if (copp_used_layer[vlay]) { // layer used for copper an visible
if (vlay == 1)
printf("(1,%s,%5.*f,%5.*f,0) %s Shape was %s and is now %s\n",
PadShapes[pad_shape_Top_rnds[i]],
precision_of_pads,u2inch(pad_diameter_Top_or_dx[i] * pad_dy_elong_start[i]),
precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]),
s,
EaglePadShapes[pad_shape_Top_rnds[i]],
HypPadShapes[pad_shape_Top_rnds[i]] );
else if (vlay == 16)
printf("(16,%s,%5.*f,%5.*f,0f) %s Shape was %s and is now %s\n",
PadShapes[pad_shape_Bott[i]],
precision_of_pads,u2inch(pad_diameter_Bott[i] * pad_dy_elong_start[i]),
precision_of_pads,u2inch(pad_diameter_Bott[i]),
s,
EaglePadShapes[pad_shape_Top_rnds[i]],
HypPadShapes[pad_shape_Top_rnds[i]] );
else printf("(%d,0,%5.*f,%5.*f,0) %s always round in inner layer\n",
vlay,
precision_of_pads,u2inch(pad_diameter_Inner[i]),
precision_of_pads,u2inch(pad_diameter_Inner[i]),
s );
}
}
}
}
printf("}\n\n");
}
}
// SIGNALS
printheader("Nets");
int Pad_ID, Xpad, Ypad, EpadX, EpadY, TLaylimit, Blaylimit;
B.signals(S) {
printf("{NET=%s\n",S.name);
S.contactrefs(C) {
if (C.contact.pad) {
Pad_ID = Find_A_Pad( ISAPAD, 0,
C.contact.pad.shape[1], C.contact.pad.shape[2], C.contact.pad.shape[16],
C.contact.pad.angle,
C.contact.pad.diameter[1], C.contact.pad.diameter[2], C.contact.pad.diameter[16],
C.contact.pad.elongation,
C.contact.pad.drill );
if ( Pad_ID >= 0) {
Xpad = C.contact.pad.x;
EpadX = Xpad;
Ypad = C.contact.pad.y;
EpadY = Ypad;
TLaylimit = 1;
Blaylimit = 16;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -