• 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. Equality of dbObjects

Stats

  • Locked Locked
  • Replies 7
  • Subscribers 143
  • Views 15072
  • 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

Equality of dbObjects

tweeks
tweeks over 13 years ago

Are dbobjects ever equal?

I did a test, creating two labels that are exact copies of eachother: same lpp, same xy, etc. Watch what happens:

> forall(prop label1->? get(label1 prop) == get(label2 prop))
 t
> label1 == label2 
 nil 

Looks like equality is not implemented for labels?

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 13 years ago

     You can already overload the builtin operators within a SKILL++ lexical scope by defining a function with the same name. For example, see this code example (put in a file with a .ils suffix before loading)

    let((a)
     flet(((arrayref (arr ind) arr[ind] || (arr[ind]=makeTable('tab nil))))

      a=makeTable('tab nil)
      a["hello"]["world"]["andrew"]=123
     )
    )

    defmacro(WithAutoHash (@rest body)
     `flet(((arrayref (arr ind) arr[ind] || (arr[ind]=makeTable('tab nil))))
       ,@body
      )
    )

    procedure(TrExampleArray()
      let(((arr makeTable('tab nil)))
        WithAutoHash(
          arr["my"]["big"]["test"]=7
          arr["my"]["other"]["test"]=9
          arr
        )
      )
    )

    This example defines a macro, WithAutoHash, within which it redefines the meaning of arrayref to behave differently - to automatically define an array if an unused index is used. You could do a similar thing with equal (without the macro), using an object oriented approach to define relevant methods (use toplevel('ils) if pasting in the CIW, or a .ils suffix if in a file):

    defgeneric(myEqual (obj1 obj2)
      obj1==obj2
    )

    defmethod(myEqual ((obj1 dbobject) (obj2 dbobject))
      ; do your comparison (return t for now for illustration)
      t
    )

    ; overrride == within the lexical scope defined by the let
    let(((equal myEqual))
      printf("Equality test %L\n" dbObj1==dbObj2)
    )

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Andrew Beckett
    Andrew Beckett over 13 years ago

     You can already overload the builtin operators within a SKILL++ lexical scope by defining a function with the same name. For example, see this code example (put in a file with a .ils suffix before loading)

    let((a)
     flet(((arrayref (arr ind) arr[ind] || (arr[ind]=makeTable('tab nil))))

      a=makeTable('tab nil)
      a["hello"]["world"]["andrew"]=123
     )
    )

    defmacro(WithAutoHash (@rest body)
     `flet(((arrayref (arr ind) arr[ind] || (arr[ind]=makeTable('tab nil))))
       ,@body
      )
    )

    procedure(TrExampleArray()
      let(((arr makeTable('tab nil)))
        WithAutoHash(
          arr["my"]["big"]["test"]=7
          arr["my"]["other"]["test"]=9
          arr
        )
      )
    )

    This example defines a macro, WithAutoHash, within which it redefines the meaning of arrayref to behave differently - to automatically define an array if an unused index is used. You could do a similar thing with equal (without the macro), using an object oriented approach to define relevant methods (use toplevel('ils) if pasting in the CIW, or a .ils suffix if in a file):

    defgeneric(myEqual (obj1 obj2)
      obj1==obj2
    )

    defmethod(myEqual ((obj1 dbobject) (obj2 dbobject))
      ; do your comparison (return t for now for illustration)
      t
    )

    ; overrride == within the lexical scope defined by the let
    let(((equal myEqual))
      printf("Equality test %L\n" dbObj1==dbObj2)
    )

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

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