• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Is it possible to make autoAbutment with shapes with StrongConnection...

Stats

  • Locked Locked
  • Replies 0
  • Subscribers 143
  • Views 12626
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Is it possible to make autoAbutment with shapes with StrongConnection?

Slayer
Slayer over 13 years ago

I've found strange situation during autoAbutment, that when shapes has weakConnection autoAbutment works fine, but in case when shapes has strongConnection, align of objects will be relative to first elemеnt in pin list.

There is my small test case. Create the simplest object which will be have schematic and layout views. On schematic view objects will have only one pin. For layout view use code with weakConnection:

[CODE]

let( (DseCellLibrary pcellId)
   DseCellLibrary = "test_lib"
   unless( ddGetObj(DseCellLibrary nil nil nil nil "a")
      error("Couldn't open library %L" DseCellLibrary)
   )

  pcellId =  pcDefinePCell(
      list( ddGetObj(DseCellLibrary nil nil nil nil "a") "myTest" "layout")

      /****************************************************************************
      /*
      /* Default Parameters
      /*
      /***************************************************************************/
    (
    )

     let(( pcCV p1 p2 netId termId pinId
         )
     
     dbCreateRect(pcCellView "active" list(0:0 6:4));
     p1 = dbCreateRect(pcCellView "m1" list(0:0 1:4));
     p2 = dbCreateRect(pcCellView "m1" list(5:0 6:4));
      
      netId = dbMakeNet(pcCellView "p1");
      termId = dbCreateTerm(netId "p1" "inputOutput");
      pinId = dbCreatePin(netId p1);
      pinId~>accessDir = list("top" "bottom" "left" "right");

      netId = dbMakeNet(pcCellView "p2");
      termId = dbCreateTerm(netId "p1" "inputOutput");
      pinId = dbCreatePin(netId p2);
      pinId~>accessDir = list("top" "bottom" "left" "right");


      ;dbAddFigToPin(pinId p2);
     
      dbReplaceProp(p1 "abutAccessDir" "list" list("left") );
      dbReplaceProp(p1 "abutClass" "string" "aaa");
      dbReplaceProp(p1 "abutFunction" "string" "abutTest");
      dbReplaceProp(p1 "vxlInstSpacingDir" "list" list("left") );
      dbReplaceProp(p1 "vxlInstSpacingRule" "float" 2.0);

      dbReplaceProp(p2 "abutAccessDir" "list" list("right") );
      dbReplaceProp(p2 "abutClass" "string" "aaa");
      dbReplaceProp(p2 "abutFunction" "string" "abutTest");
      dbReplaceProp(p2 "vxlInstSpacingDir" "list" list("right") );
      dbReplaceProp(p2 "vxlInstSpacingRule" "float" 2.0);

     
     );end let 1
   );edn pcdefine
  
   dbClose( pcellId )
  
);end let2

[/CODE]

 And check autoAbutment.

After that recompile pcell with storngConnection:

[CODE]

 let( (DseCellLibrary pcellId)
   DseCellLibrary = "tsmc18_test"
   unless( ddGetObj(DseCellLibrary nil nil nil nil "a")
      error("Couldn't open library %L" DseCellLibrary)
   )

  pcellId =  pcDefinePCell(
      list( ddGetObj(DseCellLibrary nil nil nil nil "a") "myTest" "layout")

      /****************************************************************************
      /*
      /* Default Parameters
      /*
      /***************************************************************************/
    (
    )

     let(( pcCV p1 p2 netId termId pinId
         )
    
     dbCreateRect(pcCellView "active" list(0:0 6:4));
     p1 = dbCreateRect(pcCellView "m1" list(0:0 1:4));
     p2 = dbCreateRect(pcCellView "m1" list(5:0 6:4));
       
      netId = dbMakeNet(pcCellView "p1");
      termId = dbCreateTerm(netId "p1" "inputOutput");
      pinId = dbCreatePin(netId p1)
      pinId~>accessDir = list("top" "bottom" "left" "right")

      ;netId = dbMakeNet(pcCellView "p2");
      ;termId = dbCreateTerm(netId "p1" "inputOutput");
      ;pinId = dbCreatePin(netId p2)
      ;pinId~>accessDir = list("top" "bottom" "left" "right")


      dbAddFigToPin(pinId p2);
      
      dbReplaceProp(p1 "abutAccessDir" "list" list("left") );
      dbReplaceProp(p1 "abutClass" "string" "nmos_uhv");
      dbReplaceProp(p1 "abutFunction" "string" "abutTest");
      dbReplaceProp(p1 "vxlInstSpacingDir" "list" list("left") );
      dbReplaceProp(p1 "vxlInstSpacingRule" "float" 2.0);

      dbReplaceProp(p2 "abutAccessDir" "list" list("right") );
      dbReplaceProp(p2 "abutClass" "string" "nmos_uhv");
      dbReplaceProp(p2 "abutFunction" "string" "abutTest");
      dbReplaceProp(p2 "vxlInstSpacingDir" "list" list("right") );
      dbReplaceProp(p2 "vxlInstSpacingRule" "float" 2.0);

      
     );end let 1
   );edn pcdefine
   
   dbClose( pcellId )
   
);end let2

[/CODE]

 

And check it again. And you will see, that autoAButment works not correctly. And my question how I can avoid this situation?

 

P.S. for autoAbutment function use simplest skill code, like this:

[CODE]

 procedure(abutTest(ti ri tp rp dir cont event @optional group)
   let(
       (

        ret
       )


      (case event
         ;-------------------------------------------------------------------
         ; Return abutment spacing.
         (1

           ret = 0.0;
       ret;

         ); 1

         ;-------------------------------------------------------------------
         ; Reset pins to old shapes.
         (3
    
       ret = t;
       
           ret;
       
         ); 3

         ;-------------------------------------------------------------------
         ; Figure out what to do with all the pins.
         (2
    
       ret = t;
           t;
       
         ); 2
         (t ; Anything else return a nil
    
          ret = nil;
      
         );t
         
      );end case

      ret;
        
   );end let
);end procedure

[/CODE]

  • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information