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

📄 hyperlynx-4_11.ulp

📁 老外的PCB设计软件,是免费的.可以上网更新.
💻 ULP
📖 第 1 页 / 共 5 页
字号:
      // 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 + -