Ejemplo n.º 1
0
        public int type;        //string type;

        /*public Segment(int inX, int inY, int inWidth, int inHeight)
         * {
         *      X = inX;
         *      Y = inY;
         *      width = inWidth;
         *      height = inHeight;
         * }*/

        public LineStruct(PairInt firstPoint, ContactSimple secPoint)
        {
            first = new PairInt(firstPoint);
            type  = secPoint.layer;
            if (firstPoint.y == secPoint.y)
            {
                X = firstPoint.x;
                if (firstPoint.x > secPoint.x)
                {
                    X = secPoint.x;
                }
                Y      = firstPoint.y;
                width  = Math.Abs(firstPoint.x - secPoint.x);
                height = 0;
            }
            else
            {
                X = firstPoint.x;
                Y = firstPoint.y;
                if (firstPoint.y > secPoint.y)
                {
                    Y = secPoint.y;
                }
                width  = 0;
                height = Math.Abs(firstPoint.y - secPoint.y);
            }
        }
Ejemplo n.º 2
0
        public ContactSimple OpositePoint(ContactSimple inCont)
        {
            ContactSimple oppositeCont = new ContactSimple(inCont);

            oppositeCont.layer = type;
            if (Height > 0)
            {
                if (inCont.y != Top)
                {
                    oppositeCont.y = Top;
                }
                else
                {
                    oppositeCont.y = Bottom;
                }
            }
            else
            {
                if (inCont.x != Left)
                {
                    oppositeCont.x = Left;
                }
                else
                {
                    oppositeCont.x = Right;
                }
            }
            return(oppositeCont);
        }
Ejemplo n.º 3
0
        public int GetDistance(ContactSimple inCnt)
        {
            int dist = Math.Abs(inCnt.x - x);

            dist += Math.Abs(inCnt.y - y);
            return(dist);
        }
Ejemplo n.º 4
0
        public ContactSimple GetVerticalPosition(int inY)
        {
            ContactSimple retCont = new ContactSimple(this);

            retCont.y = inY;
            return(retCont);
        }
Ejemplo n.º 5
0
        public ContactSimple GetHorizontPosition(int inX)
        {
            ContactSimple retCont = new ContactSimple(this);

            retCont.x = inX;
            return(retCont);
        }
Ejemplo n.º 6
0
        public ContactSimple GetHigherPoint(int shift)
        {
            ContactSimple higherCont = new ContactSimple(this);

            higherCont.y += (shift + 1);
            return(higherCont);
        }
Ejemplo n.º 7
0
        public ContactSimple GetLowerPoint(int shift)
        {
            ContactSimple lowerCont = new ContactSimple(this);

            lowerCont.y -= (shift + 1);
            return(lowerCont);
        }
Ejemplo n.º 8
0
        private string AddAlloying(ContactSimple inCnt)
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture("en-CA");
            double      coordX  = ((double)inCnt.x) / 2.0;
            double      coordY  = ((double)inCnt.y) / 2.0;

            double moveY  = coordY;
            string retStr = "";

            /*if (inCnt.typePoint == Params.cnaType)
             * {
             *                  if ( Params.IsModelBusInEdge() )
             *                          moveY += 0.5;
             *                  else
             *                          moveY -= 0.5;
             *                  retStr = "    OR(NORTH) CENAPE(" + coordX.ToString("F2", culture) + "," + coordY.ToString("F2", culture) +
             *                          ", " + coordX.ToString("F2", culture) + "," + moveY.ToString("F2", culture) + ");";
             * }
             * else
             * {
             *                  if ( Params.IsModelBusInEdge() )
             *                          moveY -= 0.5;
             *                  else
             *                          moveY += 0.5;
             *
             *                  retStr = "    OR(NORTH) CEPANE(" + coordX.ToString("F2", culture) + "," + coordY.ToString("F2", culture) +
             *                          ", " + coordX.ToString("F2", culture) + "," + moveY.ToString("F2", culture) + ");";
             * }*/

            return(retStr);
        }
Ejemplo n.º 9
0
 public void AddContact(ContactSimple inNewCont)
 {
     if (arcCollection.FindIndex(element => element == inNewCont) < 0)
     {
         arcCollection.Add(inNewCont);
     }
 }
Ejemplo n.º 10
0
 public NodePaths(string inName, ContactSimple inContact, int inNumberNode)
 {
     name       = inName;
     startPoint = inContact;            //new Contact(inContact)
     //currentEnds = new List<Contact>();
     //currentEnds.Add(inContact.GetHigherPoint(0));
     //currentEnds.Add(inContact.GetLowerPoint(0));
     numberNode = inNumberNode;
     //seekNumbers = new List<int>();
 }
Ejemplo n.º 11
0
 // Compares by x positions
 public static int CompareByX(ContactSimple in1, ContactSimple in2)
 {
     if (in1.x > in2.x)
     {
         return(-1);
     }
     else if (in1.x == in2.x)
     {
         return(0);
     }
     return(1);
 }
Ejemplo n.º 12
0
 public void AddNamedPins(List <ContactNamed> inCts)
 {
     foreach (ContactNamed cnt in inCts)
     {
         Node fndNode = nodeList.Find(nd => nd.name == cnt.namePoint);
         if (diffusionException.FindIndex(name => name == cnt.namePoint) < 0 && fndNode != null)
         {
             ContactSimple smpl = new ContactSimple(cnt);
             smpl.SetInOut();
             fndNode.arcCollection.Add(smpl);
         }
     }
 }
Ejemplo n.º 13
0
        private void InitGndVccConts()
        {
            int lay = Layers.metal1Trace;

            if (Params.IsModelBusM2InMiddle())
            {
                lay = Layers.metal2Trace;
            }

            ContactSimple busStart = new ContactSimple(Params.leftEdge, Params.VccPosition, lay);
            ContactSimple busEnd   = new ContactSimple(wide - 1, Params.VccPosition, lay);

            if (processNode.name == Params.GndName)
            {
                busStart.y = Params.GndPosition;
                busEnd.y   = Params.GndPosition;
            }
            busEnd.SetInOut();
            busStart.SetInOut();
            processNode.arcCollection.Insert(0, busEnd);
            processNode.arcCollection.Insert(0, busStart);

            int idxLast = processNode.arcCollection.Count;
            NodeDistanceBase dictUnit = new NodeDistanceBase(idxLast, processNode.name);

            for (int i = 0; i < idxLast; i++)
            {
                for (int j = i + 1; j < idxLast; j++)
                {
                    bool connected       = true;
                    bool fixedConnection = false;
                    if (i == 0 && j == 1)
                    {
                        fixedConnection = true;
                    }

                    if (i != j)
                    {
                        dictUnit.AddDistance(i, j, LineStruct.Distance(processNode.arcCollection[i],
                                                                       processNode.arcCollection[j]), connected, fixedConnection);
                    }
                }
            }

            if (idxLast > 1)
            {
                nodeDistanceDict.Add(processNode.name, dictUnit);
            }
        }
Ejemplo n.º 14
0
        private void TraceVccGndBus()
        {
            int vccGndType = Layers.metal1Trace;    // Params.met1Type;

            if (Params.IsModelBusM2InMiddle())
            {
                vccGndType = Layers.metal2Trace;        //Params.met2Type;
            }
            ContactSimple left  = new ContactSimple(0, Params.GndPosition, vccGndType);
            ContactSimple right = new ContactSimple(wide - 1, Params.GndPosition, vccGndType);

            fixedConnections.Add(new LineStruct(left, right));

            left  = new ContactSimple(0, Params.VccPosition, vccGndType);
            right = new ContactSimple(wide - 1, Params.VccPosition, vccGndType);
            fixedConnections.Add(new LineStruct(left, right));
        }
Ejemplo n.º 15
0
        public ContactSimple GetNearContact(ContactSimple inCont)
        {
            ContactSimple retCnt = new ContactSimple(inCont.x, inCont.y, type);

            if (Top == Bottom)
            {
                if (Left > inCont.x)
                {
                    retCnt.x = Left;
                }
                else if (Right < inCont.x)
                {
                    retCnt.x = Right;
                }
                retCnt.y = Top;
            }
            if (Left == Right)
            {
                //if (levelY == inCont.levelY)
                //{
                if (Bottom > inCont.y)
                {
                    retCnt.y = Bottom;
                }
                else if (Top < inCont.y)
                {
                    retCnt.y = Top;
                }
                retCnt.x = Left;

                /*}
                 * else if (levelY == Params.levelN)
                 * {
                 *      retCnt.position.y = Bottom;
                 * }
                 * else if (levelY == Params.levelP)
                 * {
                 *      retCnt.position.y = Top;
                 * }*/
            }
            return(retCnt);
        }
Ejemplo n.º 16
0
 public bool OverlapWithPoint(ContactSimple inCnt)
 {
     if (type == inCnt.layer)
     {
         if ((Width == 0) && (X == inCnt.x))
         {
             if ((inCnt.y >= Bottom) && (inCnt.y <= Top))
             {
                 return(true);
             }
             return(false);
         }
         if ((Height == 0) && (Y == inCnt.y))
         {
             if ((inCnt.x >= Right) && (inCnt.x <= Left))
             {
                 return(true);
             }
             return(false);
         }
     }
     return(false);
 }
Ejemplo n.º 17
0
        static public List <VariantTrace> GetConnectionPoints(ContactSimple inCnt1, ContactSimple inCnt2, int wide)
        {
            List <VariantTrace> retList = new List <VariantTrace>();


            if (inCnt1.x == inCnt2.x)
            {
                VariantTrace trace1 = new VariantTrace();
                trace1.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                retList.Add(trace1);

                //if (inCnt1.x - 1 >= 0)
                {
                    VariantTrace trace2 = new VariantTrace();
                    trace2.pnt.Add(new ContactSimple(inCnt1.x - 1, inCnt1.y, inCnt1.layer));
                    trace2.pnt.Add(new ContactSimple(inCnt1.x - 1, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace2.pnt.Add(new ContactSimple(inCnt1.x - 1, inCnt2.y, inCnt1.layer));
                    retList.Add(trace2);
                }

                //if (inCnt1.x + 1 < wide)
                {
                    VariantTrace trace3 = new VariantTrace();
                    trace3.pnt.Add(new ContactSimple(inCnt1.x + 1, inCnt1.y, inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(inCnt1.x + 1, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(inCnt1.x + 1, inCnt2.y, inCnt1.layer));
                    retList.Add(trace3);
                }

                return(retList);
            }

            if (inCnt1.y == inCnt2.y)
            {
                VariantTrace trace1 = new VariantTrace();
                trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                retList.Add(trace1);

                //if (inCnt1.y - 1 >= 0)
                {
                    VariantTrace trace2 = new VariantTrace();
                    trace2.pnt.Add(new ContactSimple(inCnt1.x, inCnt1.y - 1, inCnt1.layer));
                    trace2.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y - 1, inCnt1.layer));
                    trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y - 1, inCnt1.layer));
                    retList.Add(trace2);
                }

                //if (inCnt1.x + 1 < wide)
                {
                    VariantTrace trace3 = new VariantTrace();
                    trace3.pnt.Add(new ContactSimple(inCnt1.x, inCnt1.y, inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer));
                    retList.Add(trace3);
                }

                return(retList);
            }

            if (Math.Abs(inCnt1.x - inCnt2.x) == 1)
            {
                if (Math.Abs(inCnt1.y - inCnt2.y) == 1)
                {
                    VariantTrace trace1 = new VariantTrace();
                    trace1.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer));
                    retList.Add(trace1);
                    VariantTrace trace2 = new VariantTrace();
                    trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer));
                    retList.Add(trace2);
                }
                if (Math.Abs(inCnt1.y - inCnt2.y) == 2)
                {
                    VariantTrace trace1 = new VariantTrace();
                    trace1.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer));
                    trace1.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    retList.Add(trace1);
                    VariantTrace trace2 = new VariantTrace();
                    trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer));
                    trace2.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    retList.Add(trace2);
                    VariantTrace trace3 = new VariantTrace();
                    trace3.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    retList.Add(trace3);
                }
            }

            if (Math.Abs(inCnt1.x - inCnt2.x) == 2)
            {
                if (Math.Abs(inCnt1.y - inCnt2.y) == 1)
                {
                    VariantTrace trace1 = new VariantTrace();
                    trace1.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer));
                    trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer));
                    retList.Add(trace1);
                    VariantTrace trace2 = new VariantTrace();
                    trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer));
                    trace2.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                    retList.Add(trace2);
                    VariantTrace trace3 = new VariantTrace();
                    trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer));
                    retList.Add(trace3);
                }
                if (Math.Abs(inCnt1.y - inCnt2.y) == 2)
                {
                    VariantTrace trace1 = new VariantTrace();
                    trace1.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace1.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    retList.Add(trace1);
                    VariantTrace trace2 = new VariantTrace();
                    trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                    trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer));
                    retList.Add(trace2);
                    VariantTrace trace3 = new VariantTrace();
                    trace3.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer));
                    trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer));
                    retList.Add(trace3);
                    VariantTrace trace4 = new VariantTrace();
                    trace4.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace4.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer));
                    trace4.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                    retList.Add(trace4);
                    VariantTrace trace5 = new VariantTrace();
                    trace5.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace5.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace5.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer));
                    retList.Add(trace5);
                    VariantTrace trace6 = new VariantTrace();
                    trace6.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace6.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer));
                    trace6.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer));
                    retList.Add(trace6);
                }
            }
            return(retList);
        }
Ejemplo n.º 18
0
 public ContactSimple(ContactSimple inCont) : base(inCont)
 {
     layer = inCont.layer;
     inOut = inCont.inOut;
 }
Ejemplo n.º 19
0
 public ContactSimple(ContactSimple inCont, int inLayer) : base(inCont)
 {
     layer = inLayer;
     inOut = inCont.inOut;
 }
Ejemplo n.º 20
0
        private void SetStartVccGndConnections(int curPrior)
        {
            int middleLine = Layers.metal1Trace;

            if (Params.IsModelBusM2InMiddle())
            {
                middleLine = Layers.metal2Trace;
            }
            else if (Params.IsModelWithDif())
            {
                SetStartVccGndWithDiff(curPrior);
                return;
            }
            if (processNode.name == Params.GndName)
            {
                for (int i = 0; i < processNode.arcCollection.Count; i++)
                {
                    trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                    ContactSimple transistorPoint = processNode.arcCollection[i].GetHigherPoint(2);
                    if (processNode.arcCollection[i].y > Params.GndPosition)
                    {
                        transistorPoint = processNode.arcCollection[i].GetLowerPoint(2);
                    }

                    if (!processNode.arcCollection[i].isInOut())
                    {
                        trace.SetLine(new LineStruct(transistorPoint,
                                                     new ContactSimple(processNode.arcCollection[i].x, Params.GndPosition, Layers.metal1Trace)),
                                      processNode.name, curPrior, 0, false);
                    }
                }

                trace.SetLine(new LineStruct(new PairInt(Params.leftEdge, Params.GndPosition),
                                             new ContactSimple(wide - 1, Params.GndPosition, middleLine)),
                              processNode.name, curPrior, 0, true);
            }
            if (processNode.name == Params.VccName)
            {
                for (int i = 0; i < processNode.arcCollection.Count; i++)
                {
                    trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                    ContactSimple transistorPoint = processNode.arcCollection[i].GetHigherPoint(2);
                    if (processNode.arcCollection[i].y > Params.VccPosition)
                    {
                        transistorPoint = processNode.arcCollection[i].GetLowerPoint(2);
                    }

                    if (!processNode.arcCollection[i].isInOut())
                    {
                        trace.SetLine(new LineStruct(transistorPoint,
                                                     new ContactSimple(processNode.arcCollection[i].x, Params.VccPosition, Layers.metal1Trace)),
                                      processNode.name, curPrior, 0, false);
                    }
                }

                trace.SetLine(new LineStruct(new PairInt(Params.leftEdge, Params.VccPosition),
                                             new ContactSimple(wide - 1, Params.VccPosition, middleLine)),
                              processNode.name, curPrior, 0, true);
            }
        }
Ejemplo n.º 21
0
        /*private void SetInitPoint()
         * {
         *  for (int i = 0; i < processNode.arcCollection.Count; i++)
         *  {
         *      trace.SetContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetHigherPoint(0)), processNode.name, i, 0);
         *      trace.SetContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetLowerPoint(0)), processNode.name, i, 0);
         *  }
         * }*/

        private void SetStartPriority(TraceGlobe trace)
        {
            List <NodeDistanceBase> lst = nodeDistanceDict.Values.ToList();

            lst.Sort(NodeDistanceBase.CompareBaseByDist);
            int countNd = lst.Count;

            //bestHighPrior = lst.First().name;
            trace.SetHighPriority(lst.First().name);

            int curPrior = Params.maxPriority;

            foreach (NodeDistanceBase disBase in lst)//Node curNode in nodeList)
            {
                processNode = trace.GetNodeByName(disBase.name);

                if (diffusionExcep.FindIndex(el => el == processNode.name) >= 0)
                {
                    SetStartVccGndConnections(curPrior);
                }
                else
                {
                    //List<int> markedPin = new List<int>();
                    for (int i = 0; i < processNode.arcCollection.Count; i++)
                    {
                        int           idx = nodeDistanceDict[processNode.name].GetNumber(i);
                        ContactSimple cnt = processNode.arcCollection[i];

                        //List<Contact> sours = trace.GetSourceContacts(processNode.arcCollection[i])

                        trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                        bool notOpposite = true;
                        for (int j = i + 1; j < processNode.arcCollection.Count; j++)
                        {
                            if (processNode.arcCollection[i].x == processNode.arcCollection[j].x)
                            {
                                //trace.SetLine(new LineStruct(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.arcCollection[j].GetInDiffusionEdge()),
                                //	          processNode.name, curPrior, idx, true);
                                trace.SetStartLine(processNode.arcCollection[i], processNode.arcCollection[j],
                                                   processNode.name, curPrior, idx);


                                trace.SetContact(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.name, idx, curPrior, 0);

                                List <ContactSimple> startWave = new List <ContactSimple>();
                                startWave.Add(new ContactSimple(processNode.arcCollection[i].GetInDiffusionEdge()));
                                NodePointProcess proc = new NodePointProcess(0, curPrior, idx, false);
                                trace.CompleteSpreadWaveProcess(startWave, proc);                //SpreadWaveProcess

                                notOpposite = false;
                            }
                        }

                        if (notOpposite)        //markedPin.FindIndex(el => el == i) < 0)
                        {
                            trace.SetContact(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.name, idx, curPrior, 0);

                            /*trace.SetPinContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetHigherPoint(0)),
                             *                  processNode.name, idx, curPrior);
                             * trace.SetPinContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetLowerPoint(0)),
                             *                  processNode.name, idx, curPrior);*/
                        }
                    }
                }
                curPrior--;
            }
        }
Ejemplo n.º 22
0
 public int DifferenceX(ContactSimple cntIn)
 {
     return(Math.Abs(x - cntIn.x));
 }