home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / p / p078 / 3.img / NETFORMS.PLB / EDIF.CH < prev    next >
Encoding:
Text File  |  1991-10-14  |  15.4 KB  |  577 lines

  1. /*
  2.     /L Do not append sheet number to labels
  3.     /P Output pin numbers (instead of pin names)
  4.  */
  5.  
  6. /*  VERSION="1.10   14-OCT-91"
  7.  *      - Altered PostFile to handle sheets with zero parts
  8.  *      - Moved comment in the cell definition after the cellType
  9.  *      - Added handling for 0 parts and/or 0 nets in a design
  10.  *      - Added code to strip path information from sheet filenames
  11.  *      - Added Version message
  12.  *      - Corrected int to unsigned comparison
  13.  *
  14.  *  Capacities:
  15.  *      - Part Names are not checked for length
  16.  *      - Module Names are not checked for length
  17.  *      - Reference Strings are not checked for length
  18.  *      - Node Names are not checked for length
  19.  *      - Node Numbers are limited to 5 digits (plus the leading 'N')
  20.  *      - Pin Numbers are not checked for length
  21.  *
  22.  *  Characters:
  23.  *      - Legal characters are { '_', '0-9', 'a-z', 'A-Z' }
  24.  *      - Remember that case is not significant in EDIF
  25.  *
  26.  *      - Names with illegal characters will be handled as follows:
  27.  *          1  A WARNING will be issued
  28.  *          2  '-' -> 'MINUS'   '+' -> 'PLUS'   '\', '/' -> 'BAR'  all others -> '_'
  29.  *          3  The original name will be RENAMEd to the new
  30.  *
  31.  */
  32.  
  33. int sw_L;
  34. int sw_P;
  35.  
  36. int legal;
  37. int len;
  38. int ch;
  39. int ok;
  40. int first;
  41.  
  42. /*-----------------------*/
  43.  
  44. Initialize()
  45. {
  46.     WriteString(0, "Creating Netlist...");
  47.     WriteCrLf(0);
  48.  
  49.     MakeInstanceFile();
  50.     SetTraversal("LEAF");
  51.  
  52.     AddSymbol("SignalNameStr");
  53.     AddSymbol("TempStr");
  54.     AddSymbol("Str");
  55.     AddSymbol("DesignStr");
  56.  
  57.     sw_L = SwitchIsSet("L");
  58.     sw_P = SwitchIsSet("P");
  59.  
  60.     SetCharSet("_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
  61.     SetNumberWidth(5);
  62.  
  63.     first = 1;
  64. }
  65.  
  66. /*-----------------------*/
  67.  
  68. PreFile()
  69. {
  70. }
  71.  
  72. /*-----------------------*/
  73.  
  74. PostFile()
  75. {
  76.     int i;
  77.  
  78.     if (first == 1)
  79.     {
  80.         /* write the schematic library */
  81.         WriteString(3, " (library MAIN_LIB");
  82.         WriteCrLf(3);
  83.         WriteString(3, "  (edifLevel 0)");
  84.         WriteCrLf(3);
  85.         WriteString(3, "  (technology");
  86.         WriteCrLf(3);
  87.         WriteString(3, "   (numberDefinition");
  88.         WriteCrLf(3);
  89.         WriteString(3, "    (scale 1 1 (unit distance))))");
  90.     }
  91.     WriteCrLf(3);
  92.  
  93.     ok = LastFile();
  94.     if (ok == 1)
  95.     {
  96.         /* this is the root sheet -- no pins upward in the hierarchy */
  97.         WriteString(1, "(edif ");
  98.         CopySymbol(FileName, Str);
  99.         CopySymbol(FileName, DesignStr);
  100.         ToUpper(Str);
  101.         StripPath(Str);
  102.         StripExt();
  103.         EdifName1();
  104.         WriteCrLf(1);
  105.  
  106.         WriteString(1, " (edifVersion 2 0 0)");
  107.         WriteCrLf(1);
  108.         WriteString(1, " (edifLevel 0)");
  109.         WriteCrLf(1);
  110.         WriteString(1, " (keywordMap (keywordLevel 0))");
  111.         WriteCrLf(1);
  112.         WriteString(1, " (status");
  113.         WriteCrLf(1);
  114.         WriteString(1, "  (written");
  115.         WriteCrLf(1);
  116.         WriteString(1, "   (timeStamp 0 0 0 0 0 0)");
  117.         WriteCrLf(1);
  118.         WriteString(1, "   (program \"HFORM.EXE\")");
  119.         WriteCrLf(1);
  120.         WriteString(1, "   (comment \"Original data from OrCAD/SDT schematic\"))");
  121.         WriteCrLf(1);
  122.         WriteString(1, "  (comment \"");
  123.         WriteSymbol(1, TitleString);
  124.         WriteString(1, "\")");
  125.         WriteCrLf(1);
  126.         WriteString(1, "  (comment \"");
  127.         WriteSymbol(1, DateString);
  128.         WriteString(1, "\")");
  129.         WriteCrLf(1);
  130.         WriteString(1, "  (comment \"");
  131.         WriteSymbol(1, DocumentNumber);
  132.         WriteString(1, "\")");
  133.         WriteCrLf(1);
  134.         WriteString(1, "  (comment \"");
  135.         WriteSymbol(1, Revision);
  136.         WriteString(1, "\")");
  137.         WriteCrLf(1);
  138.         WriteString(1, "  (comment \"");
  139.         WriteSymbol(1, Organization);
  140.         WriteString(1, "\")");
  141.         WriteCrLf(1);
  142.         WriteString(1, "  (comment \"");
  143.         WriteSymbol(1, AddressLine1);
  144.         WriteString(1, "\")");
  145.         WriteCrLf(1);
  146.         WriteString(1, "  (comment \"");
  147.         WriteSymbol(1, AddressLine2);
  148.         WriteString(1, "\")");
  149.         WriteCrLf(1);
  150.         WriteString(1, "  (comment \"");
  151.         WriteSymbol(1, AddressLine3);
  152.         WriteString(1, "\")");
  153.         WriteCrLf(1);
  154.         WriteString(1, "  (comment \"");
  155.         WriteSymbol(1, AddressLine4);
  156.         WriteString(1, "\"))");
  157.         WriteCrLf(1);
  158.     }
  159.  
  160.     WriteString(3, "  (cell ");
  161.     CopySymbol(FileName, Str);
  162.     ToUpper(Str);
  163.     StripPath(Str);
  164.     StripExt();
  165.     EdifName3();
  166.     WriteCrLf(3);
  167.     WriteString(3, "   (cellType generic)");
  168.     WriteCrLf(3);
  169.     WriteString(3, "   (view NetlistView");
  170.     WriteCrLf(3);
  171.     WriteString(3, "    (viewType netlist)");
  172.     WriteCrLf(3);
  173.     WriteString(3, "    (interface");
  174.  
  175.     /* write out the ports */
  176.     ok = FirstChild();
  177.     if (ok == 1)
  178.     {
  179.         ok = FirstChild();
  180.  
  181.         CopySymbol(FileName, Str);
  182.         StripExt();
  183.         CopySymbol(Str, TempStr);
  184.  
  185.         CopySymbol(PartName, Str);
  186.         StripExt();
  187.  
  188.         /* if the same, then these are the module ports for this sheet */
  189.         ok = CompareSymbol(TempStr, Str);
  190.         if (ok == 0)
  191.         {
  192.             /* the map for pin types */
  193.             SetPinMap(0, "INOUT");
  194.             SetPinMap(1, "OUTPUT");
  195.             SetPinMap(2, "INPUT");
  196.             SetPinMap(3, "INOUT");
  197.             SetPinMap(4, "OUTPUT");
  198.             SetPinMap(5, "INOUT");
  199.             SetPinMap(6, "OUTPUT");
  200.             SetPinMap(7, "INPUT");
  201.  
  202.             FirstChildPin();
  203.             do {
  204.                 WriteCrLf(3);
  205.                 WriteString(3, "     (port ");
  206.  
  207.                 if (sw_P == 0)
  208.                     { CopySymbol(PinNameString, Str); }
  209.                 else
  210.                     { CopySymbol(PinNumberString, Str); }
  211.                 EdifName3();
  212.  
  213.                 WriteString(3, " (direction ");
  214.                 i = GetStandardSymbol(PinType);
  215.                 WriteMap(3, i);
  216.                 WriteString(3, "))");
  217.             } while (NextChildPin());
  218.         }
  219.     }
  220.     WriteString(3, ")");
  221.     WriteCrLf(3);
  222.  
  223.     /* write out the instances of library parts */
  224.     SetPinMap(0, "INOUT");
  225.     SetPinMap(1, "OUTPUT");
  226.     SetPinMap(2, "INPUT");
  227.     SetPinMap(3, "INOUT");
  228.  
  229.     WriteString(3, "    (contents");
  230.  
  231.     ok = FirstPart();
  232.     if (ok == 1) {
  233.         do {
  234.             CopySymbol(ReferenceString, Str);
  235.             LoadFieldString(Str);
  236.  
  237.             WriteCrLf(3);
  238.             WriteString(3, "     (instance ");
  239.             EdifName3();
  240.             WriteCrLf(3);
  241.  
  242.             WriteString(3, "      (viewRef NetlistView");
  243.             WriteCrLf(3);
  244.  
  245.             WriteString(3, "       (cellRef ");
  246.             CopySymbol(LookupNameString, Str);
  247.             EdifName3();
  248.             WriteCrLf(3);
  249.  
  250.             WriteString(3, "        (libraryRef OrCAD_LIB)))");
  251.             WriteCrLf(3);
  252.  
  253.             WriteString(3, "      (property PartValue (string \"");
  254.             WriteSymbol(3, PartName);
  255.             WriteString(3, "\"))");
  256.             WriteCrLf(3);
  257.  
  258.             WriteString(3, "      (property ModuleValue (string \"");
  259.             len = SymbolLength(ModuleName);
  260.             if (len > 0)
  261.                 { WriteSymbol(3, ModuleName); }
  262.             else
  263.                 { WriteSymbol(3, PartName); }
  264.             WriteString(3, "\")))");
  265.         } while (NextPart());
  266.     }
  267.  
  268.     /* write out the instances of sheets */
  269.     ok = FirstChild();
  270.     if (ok == 1)
  271.     {
  272.         CopySymbol(FileName, Str);
  273.         StripExt();
  274.         CopySymbol(Str, TempStr);
  275.         
  276.         CopySymbol(PartName, Str);
  277.         StripExt();
  278.  
  279.         /* skip if this is the module ports for the current sheet */
  280.         ok = CompareSymbol(Str, TempStr);
  281.         if (ok == 0)
  282.             { ok = NextChild(); }
  283.         else
  284.             { ok = 1; }
  285.  
  286.         while (ok == 1)
  287.         {
  288.             WriteCrLf(3);
  289.             WriteString(3, "     (instance ");
  290.             CopySymbol(ReferenceString, Str);
  291.             EdifName3();
  292.             WriteCrLf(3);
  293.  
  294.             WriteString(3, "      (viewRef NetlistView");
  295.             WriteCrLf(3);
  296.  
  297.             WriteString(3, "       (cellRef ");
  298.             CopySymbol(PartName, Str);
  299.             ToUpper(Str);
  300.             StripPath(Str);
  301.             StripExt();
  302.             EdifName3();
  303.             WriteString(3, ")))");
  304.  
  305.             ok = NextChild();
  306.         }
  307.     }
  308.  
  309.     /* write out the nets */
  310.     ok = FirstNet();
  311.     if (ok == 1) {
  312.         do {
  313.             WriteCrLf(3);
  314.             WriteString(3, "     (net ");
  315.  
  316.             CopySymbol(NetNameString, Str);
  317.  
  318.             i = GetStandardSymbol(NetCode);
  319.             if (i == 'L')
  320.             {
  321.                 if (sw_L == 0)
  322.                 {
  323.                     SetNumberWidth(1);
  324.                     MakeLocalSignal("_");
  325.                     SetNumberWidth(5);
  326.                     CopySymbol(LocalSignal, Str);
  327.                 }
  328.                 EdifName3();
  329.             }
  330.             if (i == 'P')
  331.             {
  332.                 EdifName3();
  333.             }
  334.             if (i == 'S')
  335.             {
  336.                 EdifName3();
  337.             }
  338.             if (i == 'N')
  339.             {
  340.                 WriteString(3, "N");
  341.                 WriteSymbol(3, NetNumber);
  342.             }
  343.             if (i == 'U')
  344.             {
  345.                 WriteString(3, "N");
  346.                 WriteSymbol(3, NetNumber);
  347.             }
  348.             WriteCrLf(3);
  349.             WriteString(3, "      (joined");
  350.  
  351.             if (i == 'P')
  352.             {
  353.                 /* tie this net to its port -- if it is a port */
  354.                 WriteCrLf(3);
  355.                 WriteString(3, "       (portRef ");
  356.                 EdifName3();
  357.                 WriteString(3, ")");
  358.             }
  359.  
  360.             ok = FirstNode();
  361.             if (ok == 1)
  362.             {
  363.                 do {
  364.                     i = GetStandardSymbol(TypeCode);
  365.                     if (i == 'N')
  366.                     {
  367.                         WriteCrLf(3);
  368.                         WriteString(3, "       (portRef ");
  369.  
  370.                         if (sw_P == 0)
  371.                             { CopySymbol(PinNameString, Str); }
  372.                         else
  373.                             { CopySymbol(PinNumberString, Str); }
  374.                         EdifName3();
  375.  
  376.                         WriteString(3, " (instanceRef ");
  377.                         CopySymbol(ReferenceString, Str);
  378.                         EdifName3();
  379.                         WriteString(3, "))");
  380.                     }
  381.                     if (i == 'U')
  382.                     {
  383.                         WriteCrLf(3);
  384.                         WriteString(3, "       (portRef ");
  385.  
  386.                         if (sw_P == 0)
  387.                             { CopySymbol(PinNameString, Str); }
  388.                         else
  389.                             { CopySymbol(PinNumberString, Str); }
  390.                         EdifName3();
  391.  
  392.                         WriteString(3, " (instanceRef ");
  393.                         CopySymbol(ReferenceString, Str);
  394.                         EdifName3();
  395.                         WriteString(3, "))");
  396.                     }
  397.                 } while (NextNode());
  398.             }
  399.  
  400.             WriteString(3, "))");
  401.         } while (NextNet());
  402.     }
  403.     WriteString(3, ")))");
  404.  
  405.     first = 0;
  406. }
  407.  
  408. /*-----------------------*/
  409.  
  410. PostProcess()
  411. {
  412.     int i;
  413.  
  414.     WriteString(3, ")");
  415.     WriteCrLf(3);
  416.  
  417.     /* tell EDIF what cell makes up the design */
  418.     WriteString(3, " (design ");
  419.     CopySymbol(DesignStr, Str);
  420.     ToUpper(Str);
  421.     StripPath(Str);
  422.     StripExt();
  423.     EdifName3();
  424.     WriteCrLf(3);
  425.     WriteString(3, "  (cellRef ");
  426.     EdifName3();
  427.     WriteCrLf(3);
  428.     WriteString(3, "   (libraryRef MAIN_LIB))))");
  429.     WriteCrLf(3);
  430.  
  431.     /* write the external library */
  432.     WriteString(1, " (external OrCAD_LIB");
  433.     WriteCrLf(1);
  434.     WriteString(1, "  (edifLevel 0)");
  435.     WriteCrLf(1);
  436.     WriteString(1, "  (technology");
  437.     WriteCrLf(1);
  438.     WriteString(1, "   (numberDefinition");
  439.     WriteCrLf(1);
  440.     WriteString(1, "    (scale 1 1 (unit distance))))");
  441.  
  442.     /* the map for pin types */
  443.     SetPinMap(0, "INPUT");
  444.     SetPinMap(1, "INOUT");
  445.     SetPinMap(2, "OUTPUT");
  446.     SetPinMap(3, "OUTPUT");
  447.     SetPinMap(4, "INOUT");
  448.     SetPinMap(5, "OUTPUT");
  449.     SetPinMap(6, "OUTPUT");
  450.     SetPinMap(7, "INPUT");
  451.  
  452.     SetAccessType("LOOKUP");
  453.     do {
  454.         i = SymbolLength(LookupNameString);
  455.         if (i > 0) {
  456.  
  457.             WriteCrLf(1);
  458.             WriteString(1, "  (cell ");
  459.  
  460.             CopySymbol(LookupNameString, Str);
  461.             EdifName1();
  462.             WriteCrLf(1);
  463.  
  464.             WriteString(1, "   (cellType generic)");
  465.             WriteCrLf(1);
  466.             WriteString(1, "   (comment \"From OrCAD library ");
  467.             WriteSymbol(1, LibraryNameString);
  468.             WriteString(1, "\")");
  469.             WriteCrLf(1);
  470.             WriteString(1, "   (view NetlistView");
  471.             WriteCrLf(1);
  472.             WriteString(1, "    (viewType netlist)");
  473.             WriteCrLf(1);
  474.             WriteString(1, "    (interface");
  475.  
  476.             LoadFirstPin();
  477.             do {
  478.                 WriteCrLf(1);
  479.                 WriteString(1, "     (port ");
  480.  
  481.                 if (sw_P == 0)
  482.                     { CopySymbol(PinNameString, Str); }
  483.                 else
  484.                     { CopySymbol(PinNumberString, Str); }
  485.                 EdifName1();
  486.  
  487.                 WriteString(1, " (direction ");
  488.                 i = GetStandardSymbol(PinType);
  489.                 WriteMap(1, i);
  490.                 WriteString(1, "))");
  491.             } while (LoadPin());
  492.  
  493.             WriteString(1, ")))");
  494.         }
  495.     } while (NextAccessType());
  496.     WriteString(1, ")");
  497.     WriteCrLf(1);
  498.  
  499.     ConcatFile(1, 3);
  500.  
  501.     WriteString(0, "Done");
  502.     WriteCrLf(0);
  503. }
  504.  
  505. /*-----------------------*/
  506.  
  507. StripExt()
  508. {
  509.     int pos;
  510.  
  511.     ch = 46;
  512.     pos = FindSymbolChar(ch, Str);
  513.     if (pos != -1) { ch = 0; PutSymbolChar(pos, ch, Str); }
  514. }
  515.  
  516. /*-----------------------*/
  517.  
  518. EdifName1()
  519. {
  520.     legal = SymbolInCharSet(Str);
  521.     if (legal == 1)
  522.     {
  523.         WriteString(1, "&");
  524.         WriteSymbol(1, Str);
  525.     }
  526.     else
  527.     {
  528.         CopySymbol(Str, TempStr);
  529.         ExceptionsFor("EDIF", TempStr);
  530.  
  531.         WriteString(0, "WARNING: Name contains illegal characters '");
  532.         WriteSymbol(0, Str);
  533.         WriteString(0, "', changed to ");
  534.         WriteSymbol(0, TempStr);
  535.         WriteCrLf(0);
  536.  
  537.         SetSymbol(ExitType, "W");
  538.  
  539.         WriteString(1, "(rename &");
  540.         WriteSymbol(1, TempStr);
  541.         WriteString(1, " \"");
  542.         WriteSymbol(1, Str);
  543.         WriteString(1, "\")");
  544.     }
  545. }
  546.  
  547. /*-----------------------*/
  548.  
  549. EdifName3()
  550. {
  551.     legal = SymbolInCharSet(Str);
  552.     if (legal == 1)
  553.     {
  554.         WriteString(3, "&");
  555.         WriteSymbol(3, Str);
  556.     }
  557.     else
  558.     {
  559.         CopySymbol(Str, TempStr);
  560.         ExceptionsFor("EDIF", TempStr);
  561.  
  562.         WriteString(0, "WARNING: Name contains illegal characters '");
  563.         WriteSymbol(0, Str);
  564.         WriteString(0, "', changed to ");
  565.         WriteSymbol(0, TempStr);
  566.         WriteCrLf(0);
  567.  
  568.         SetSymbol(ExitType, "W");
  569.  
  570.         WriteString(3, "(rename &");
  571.         WriteSymbol(3, TempStr);
  572.         WriteString(3, " \"");
  573.         WriteSymbol(3, Str);
  574.         WriteString(3, "\")");
  575.     }
  576. }
  577.