• 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. Help on skill code for unselecting/selcting objects like...

Stats

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

Help on skill code for unselecting/selcting objects like path/wire, rectangle/polygon etc.

zeroskills
zeroskills over 15 years ago

Hi All,

First of all, i have no talent doing skill code, i have very very basic knowledge of it. here's my request, and i think it's possible because if did some reseach on it, i just don't know how to do it.

Problem:

For example, i have a wire/path and a rectangle/polygon overlapping each other, i would like to select "only" the wire/path and not the rectangle/polygon. it would be nice if there's a skill code that can turn off or on wire/path or rectangle/polygon selection like the instance button on the LSW window.

So basically i would like to have something like the intance turning on or off selection, like this...

--->leSetObjectSelectable("inst" t) instance is selectable or

--->leSetObjectSelectable("inst" nil) instance is unselectable

But i would like something like this for other objects, like wire/path, rectabgle/polygon etc. not necessarily a button but i would like it to toggle, like "shift+w" to turn it on or off using if statements.

Thanks in advance, I hope someone could help me. 

 

 

  • Cancel
  • dmay
    dmay over 15 years ago

    Did you press Apply on the form? I tested the same code and it works as advertised. I cannot select the shapes to stretch or move them.

    Derek

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • zeroskills
    zeroskills over 15 years ago

    Thanks Andrew and Derek. Yes, it's working. somehow i thought there was bug, it was working then not working. and i think i i got my bindkeys messup because i was "playing" around with another code supposed to be similar to this, that's why my stretch and move command got messed up.

    By the way, is there a way i can use a bindkey for un/selecting path/wire/etc individually, instead of a form window? like this...

    by pressing ctrl+1, i can toggle selecting and unselecting wire

    by pressing ctrl+2, i can toggle selecting and unselecting path

    by pressing ctrl+3, i can toggle selecting and unselecting text

    by pressing ctrl+4, i can toggle selecting all

    by pressing ctrl+5, i can toggle unselecting all

    and to toggle it, it's just using an if statement, right? like if it's selectable then unselect...

     

     

     

    @Andrew, maybe you remebered this code, this was actually in our system, and it was supposed to work the same, "locking" instances or so...

    /************************************************************************** 

    (defun mitDoWithLock (func)
    (foreach fig (geGetSelectedSet)
    (when fig~>lockDown == "TRUE"
    (geDeselectFig fig)))
    (when t
    (funcall func)));end defun


    (defun mitLockDownInstance ()
    (foreach fig (geGetSelectedSet)
    (dbReplaceProp fig "lockDown" "boolean" t))
    (printf "Locked down %d instances\n" (length
    (geGetSelectedSet))));end defun


    (defun mitUnLockDownInstance ()
    (foreach fig (geGetSelectedSet)
    (dbReplaceProp fig "lockDown" "boolean" nil))
    (printf "Unlocked %d instances\n" (length (geGetSelectedSet))));end
    defun


    (hiSetBindKey "Layout" "<Key>s" "(mitDoWithLock 'leHiStretch)")

    (hiSetBindKey "Layout" "<Key>m" "(mitDoWithLock 'leHiMove)")

    (hiSetBindKey "Layout" "<Key>Delete" "(mitDoWithLock 'leHiDelete)")

    (hiSetBindKey "Layout" "Ctrl<Key>l" "(mitLockDownInstance)")

    (hiSetBindKey "Layout" "Ctrl<Key>u" "(mitUnLockDownInstance)")
     

    **************************************************************************************************/ 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    I'll check the code and modify if necessary to give a function which can be used procedurally - I'll need to be back home first though - just got off a plane.

    Regards,

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • zeroskills
    zeroskills over 15 years ago

    Hi Andrew,

    Thank you very much for keeping up with me even with you being busy.  

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago

    OK, in order to implement what zeroskills requested, I had to modify two of the three files. I had to add a new function to abToggleForm.il to allow me to set the particular fields (otherwise the form got out of sync with the internal variables), and I had to modify abShapeSelectionFilter.ils to add a new function to set or toggle each function. You'll need to replace both files with those I've posted below. See the comments in the top of abShapeSelectionFilter.ils which give examples of function calls to do the setting or toggling.

    BTW, the "lockdown" code you posted - I have a sourcelink solution,  11522924, which can be used to do this. It uses the same kind of selection filter mechanism to do this, which is a bit more elegant than the lockdown wrappers (which used to be the only way to do this).

    So here are the two files. First abShapeSelectionFilter.ils :

    /* abShapeSelectionFilter.ils
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Dec 02, 2008 
    Modified   Sep 16, 2009 
    By         A.D.Beckett
    
    Main entry point:
    
    abShapeSelectionFilter()
    
    Brings up form, asking you to choose which type of shape objects
    are selectable.
    
    Written in C syntax to allow ease of modification by those scared
    of LISP ;->
    
    Requires abToggleForm.il and abLeMultiSelectionFilter.ils to
    be loaded first.
    
    Can also use:
    
    ; specify t or nil for whichever options you want to set or
    ; unset those options
    abShapeSelectionSetFilter(?setText t ?setPolygon t ?setPath nil)
    
    ; specify whichever keywords you want to toggle them
    abShapeSelectionSetFilter(?toggleText t ?togglePolygon t ?togglePath t)
    ; e.g. just toggling paths
    abShapeSelectionSetFilter(?togglePath t)
    
    ***************************************************
    
    SCCS Info: @(#) abShapeSelectionFilter.ils 09/16/09.11:58:37 1.2
    
    */
    
    importSkillVar(abShapeSelectionFilterForm)
    let(((pathsOK t) (shapesOK t) (textOK t) registered)
        /***************************************************************
        *                                                              *
        *                        (displayForm)                         *
        *                                                              *
        *     Local function, exported as abShapeSelectionFilter()     *
        *   which creates form if not already created, and displays    *
        *                             it.                              *
        *                                                              *
        ***************************************************************/
        defun(displayForm ()
    	unless(boundp('abShapeSelectionFilterForm)
    	    abCreateToggleForm(
    		?name 'abShapeSelectionFilterForm
    		?prompt "Check selectable objects:"
    		?textList '("Paths/Path Segments" "Polygons/Rects" "Text")
    		?callback 'abShapeSelectionFilterCB
    		?formTitle "Filter objects"
    		?buttonLayout 'OKCancelApply
    		?toggleHeight 80
    	    ) ; abCreateToggleForm
    	) ; unless
    	abToggleFormSetSelected(abShapeSelectionFilterForm
    	    list(
    		list("Paths/Path Segments" pathsOK)
    		list("Polygons/Rects" shapesOK)
    		list("Text" textOK)
    	    ) ; list
    	) ; abToggleFormSetSelected
    	hiDisplayForm(abShapeSelectionFilterForm)
        ) ; defun
    
        /******************************************************************
        *                                                                 *
        *                       (formCallback form)                       *
        *                                                                 *
        *   Local function, exported as abShapeSelectionFilterCB, which   *
        * takes choices from form, and updates lexically scoped variables *
        *    to remember settings - so that the filter() function can     *
        *                         reference them.                         *
        *                                                                 *
        ******************************************************************/
        defun(formCallback (form)
    	let((choices)
    	    choices=abToggleFormGetSelected(form)
    	    pathsOK=shapesOK=textOK=nil
    	    foreach(choice choices
    		case(choice
    		    ("Paths/Path Segments" pathsOK=t)
    		    ("Polygons/Rects" shapesOK=t)
    		    ("Text" textOK=t)
    		)
    	    )
    	    if(!textOK || !shapesOK || !pathsOK then
    		unless(registered
    		    registered=t
    		    abLeRegUserObjectSelectionFilter(
    			"abShapeSelectionFilterFilter"
    		    )
    		)
    	    else
    		when(registered
    		    abLeUnregUserObjectSelectionFilter(
    			"abShapeSelectionFilterFilter"
    		    )
    		)
    		registered=nil
    	    ) ; if 
    	) ; let
        ) ; defun formCallback
    
        /***************************************************************
        *                                                              *
        *  (setOrToggle @key (setPath 'unbound) (setPolygon 'unbound)  *
        *   (setText 'unbound) togglePath togglePolygon toggleText)    *
        *                                                              *
        *     A function to allow non-form setting or toggling of      *
        *                various shape filter choices.                 *
        *                                                              *
        ***************************************************************/
        defun(setOrToggle (@key (setPath 'unbound) (setPolygon 'unbound)
    	(setText 'unbound) togglePath togglePolygon toggleText)
    	when(togglePath pathsOK=!pathsOK)
    	when(togglePolygon shapesOK=!shapesOK)
    	when(toggleText textOK=!textOK)
    	when(neq(setPath 'unbound) pathsOK=setPath)
    	when(neq(setPolygon 'unbound) shapesOK=setPolygon)
    	when(neq(setText 'unbound) textOK=setText)
    	;----------------------------------------------------------------
    	; Refresh the form if needed
    	;----------------------------------------------------------------
    	when(boundp('abShapeSelectionFilterForm) && 
    	    hiIsFormDisplayed(abShapeSelectionFilterForm)
    	    displayForm()
    	)
    	t
        ) ; defun setOrToggle
    
        /***************************************************************
        *                                                              *
        *                         (filter obj)                         *
        *                                                              *
        *       The actual selection filter. This is exported to       *
        *      abShapeSelectionFilterFilter. Compares the objType      *
        *     of the object with certain values, and then returns      *
        *    the value of the flag where the user has chosen which     *
        *                       are selectable.                        *
        *                                                              *
        ***************************************************************/
        defun(filter (obj)
    	case(obj~>objType
    	    (("path" "pathSeg") pathsOK)
    	    (("rect" "polygon") shapesOK)
    	    (("label" "textDisplay") textOK)
    	    (t t)
    	) ; case
        ) ; defun filter
    
        ;--------------------------------------------------------------------
        ; Export all the functions
        ;--------------------------------------------------------------------
        abShapeSelectionFilter=displayForm
        abShapeSelectionFilterFilter=filter
        abShapeSelectionFilterCB=formCallback
        abShapeSelectionSetFilter=setOrToggle
    )
    
    

    and the new abToggleForm.il:

    /* abToggleForm.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Feb 23, 1999 
    Modified   Sep 16, 2009 
    By         A.D.Beckett
    
    Functions for creating a variable list of toggles
    with all and none toggles. The list of toggles is
    in a scroll region.
    
    Attempted to make it resizable, but this rather contradicted
    with the scroll region, so left the scroll region in the form 
    instead.
    
    Three main entry functions:
    
    abCreateToggleForm()
    abToggleFormGetSelected()
    abToggleFormSetSelected()
    
    Example:
    
    procedure(myToggleCB(form)
       printf("Selected Files were:\n")
       pprint(abToggleFormGetSelected(form))
       newline()
    )
    
    hiDisplayForm(
      abCreateToggleForm(
         ?name 'myTogForm
         ?textList getDirFiles("/bin")
         ?prompt "Choose Files"
         ?callback 'myToggleCB
      )
    )
    
    ***************************************************
    
    SCCS Info: @(#) abToggleForm.il 09/16/09.11:58:38 1.4
    
    */
    
    /********************************************************************
    *                                                                   *
    *                abCreateToggleForm(?name s_formName                *
    *              ?textList l_textitems ?prompt t_prompt               *
    *         [?formTitle t_formTitle] [?value b_defaultValue]          *
    * [?yStep x_yStep] [?formWidth x_formWidth] [?xPosition x_position] *
    *          [?toggleHeight x_height] [?toggleWidth x_width]          *
    *                      [?callback s_callback])                      *
    *     [?formType 'options/'nonoptions] [?buttonLayout 'OKCancel]    *
    *                                                                   *
    *      Create a form full of toggle items, with an all or none      *
    *       button. Must provide at least the symbol for the form       *
    *              name, the list of items, and a prompt.               *
    *                                                                   *
    ********************************************************************/
    
    procedure(abCreateToggleForm(@key 
    	(name nil)
    	(formTitle "")
    	(textList nil) 
    	(prompt "") 
    	(value t)
    	(yStep 20) (formWidth 300) 
    	(xPosition 220) (toggleHeight 200) (toggleWidth 250)
    	(callback nil)
    	(formType 'nonoptions)
    	buttonLayout
    	)
        let((toggleList togName (toggleNumber 0)
    	    (yPosition 0) topLabel allButton noneButton
    	    scrollRegion separator form)
    	;----------------------------------------------------------------
    	; delete any existing form
    	;----------------------------------------------------------------
    	when(boundp(name) && symeval(name)
    	    hiFormCancel(symeval(name))
    	    hiDeleteForm(symeval(name)))
    	;----------------------------------------------------------------
    	; Default button layout
    	;----------------------------------------------------------------
    	unless(buttonLayout
    	    buttonLayout=if(formType=='nonoptions 'OKCancel 'HideCancel)
    	    )
    	;----------------------------------------------------------------
    	; create the label at the top of the toggle list
    	;----------------------------------------------------------------
    	topLabel=hiCreateLabel(?name 'label ?labelText prompt)
    	;----------------------------------------------------------------
    	; create the toggles for each entry in the textList
    	;----------------------------------------------------------------
    	toggleList=foreach(mapcar text textList
    	    ;------------------------------------------------------------
    	    ; create the name of the toggle
    	    ;------------------------------------------------------------
    	    togName=concat('toggle ++toggleNumber)
    	    ;------------------------------------------------------------
    	    ; return the first value in the group
    	    ;------------------------------------------------------------
    	    prog1(
    		;--------------------------------------------------------
    		; create the toggle and add it onto the list
    		;--------------------------------------------------------
    		list(
    		    hiCreateBooleanButton(
    			?name togName
    			?buttonText text
    			?callback 
    			sprintf(nil "abToggleFormOtherButtonCB(%s '%s)"
    			name togName)
    			?value value
    			); hiCreateBooleanButton
    		    0:yPosition
    		    toggleWidth:yStep
    		    xPosition
    		    ); list
    		;--------------------------------------------------------
    		; increment the step 
    		;--------------------------------------------------------
    		yPosition=yPosition+yStep
    		); prog1
    	    ); foreach mapcar
    	;----------------------------------------------------------------
    	; add the line and the All and None toggles 
    	;----------------------------------------------------------------
    	separator=hiCreateSeparatorField(?name 'separator)
    	allButton=hiCreateBooleanButton(
    	    ?name 'All
    	    ?buttonText "All"
    	    ?callback sprintf(nil "abToggleFormAllButtonCB(%s)" name)
    	    ?value value
    	    )
    	noneButton=hiCreateBooleanButton(
    	    ?name 'None
    	    ?buttonText "None"
    	    ?callback sprintf(nil "abToggleFormNoneButtonCB(%s)" name)
    	    ?value !value
    	    )
    	;----------------------------------------------------------------
    	; the sroll region itself
    	;----------------------------------------------------------------
    	scrollRegion=hiCreateScrollRegion(
    	    ?name 'scrollRegion
    	    ?fields toggleList
    	    ?borderWidth 0
    	    )
    	;----------------------------------------------------------------
    	; create the form
    	;----------------------------------------------------------------
    	form=hiCreateAppForm(
    	    ?name name
    	    ?fields list(
    		list(topLabel 0:0 formWidth:yStep*2)
    		list(scrollRegion 0:yStep*2 formWidth:toggleHeight)
    		list(separator 0:toggleHeight+yStep*2 formWidth:0)
    		list(allButton 0:toggleHeight+yStep*3 formWidth:yStep xPosition)
    		list(noneButton 0:toggleHeight+yStep*4 formWidth:yStep xPosition)
    		)
    	    ?formTitle formTitle
    	    ?formType formType
    	    ?buttonLayout buttonLayout
    	    ?callback callback
    	    )
    	;----------------------------------------------------------------
    	; store various information on the form
    	;----------------------------------------------------------------
    	form->numButtons=toggleNumber
    	if(value then
    	    form->numSelected=toggleNumber
    	else 
    	    form->numSelected=0
    	    )
    	form
    	))
    
    /***************************************************************
    *                                                              *
    *            abToggleFormOtherButtonCB(form field)             *
    *                                                              *
    *  Callback for each toggle (except all or none) on the form   *
    *                                                              *
    ***************************************************************/
    
    procedure(abToggleFormOtherButtonCB(form field)
        let((numSelected)
    	numSelected=form->numSelected
    	if(get(form->scrollRegion field)->value 
    	    numSelected++
    	    numSelected--)
    	form->numSelected=numSelected
    	form->None->value=numSelected==0
    	form->All->value=numSelected==form->numButtons
        ))
    
    /***************************************************************
    *                                                              *
    *              abToggleFormAllButtons(form value)              *
    *                                                              *
    *    Utility function to set all the buttons to a specified    *
    *                            value.                            *
    *                                                              *
    ***************************************************************/
    
    procedure(abToggleFormAllButtons(form value)
        let(((scrollRegion form->scrollRegion))
    	foreach(field scrollRegion->fieldList
    	    get(scrollRegion field)->value=value
    	    )
        ))
    
    /***************************************************************
    *                                                              *
    *                abToggleFormAllButtonCB(form)                 *
    *                                                              *
    *                 Callback for the All button                  *
    *                                                              *
    ***************************************************************/
    
    procedure(abToggleFormAllButtonCB(form)
        cond(
    	(form->All->value
    	    abToggleFormAllButtons(form t))
    	(form->numSelected==form->numButtons
    	    form->All->value=t)
    	)
        )
    
    /***************************************************************
    *                                                              *
    *                abToggleFormNoneButtonCB(form)                *
    *                                                              *
    *                 Callback for the None button                 *
    *                                                              *
    ***************************************************************/
    
    procedure(abToggleFormNoneButtonCB(form)
        cond(
    	(form->None->value
    	    abToggleFormAllButtons(form nil))
    	(form->numSelected==0
    	    form->None->value=t)
    	)
        )
    
    /***************************************************************
    *                                                              *
    *                abToggleFormGetSelected(form)                 *
    *                                                              *
    *  Function that may be used in the form callback function to  *
    *             retrieve all the selected item names             *
    *                                                              *
    ***************************************************************/
    
    procedure(abToggleFormGetSelected(form)
        let(((scrollRegion form->scrollRegion))
    	foreach(mapcar field
    	    setof(field scrollRegion->fieldList
    		get(scrollRegion field)->value)
    	    get(scrollRegion field)->prompt
    	    )
    	))
    
    procedure(abToggleFormSetSelected(form promptValList)
        let(((scrollRegion form->scrollRegion) (fieldTable makeTable('fields nil))
    	    foundField)
    	foreach(field scrollRegion->fieldList
    	    fieldTable[get(scrollRegion field)->prompt]=field
    	    )
    	foreach(promptVal promptValList
    	    foundField=fieldTable[car(promptVal)]
    	    if(foundField then
    		get(scrollRegion foundField)->value=cadr(promptVal)
    	    else
    		warn("No toggle with prompt %L on form\n" car(promptVal))
    		)
    	    )
    	t
    	)
        )
    
    

    Best Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • zeroskills
    zeroskills over 15 years ago

    Hi Andrew, just checked the new codes and it works perfectly! Thanks you very much.

    Also one more request from yesterday., 

    Is there a way i can use a bindkey for un/selecting path/wire/etc individually, instead of a form window? like this...

    by pressing ctrl+1, i can toggle selecting and unselecting wire

    by pressing ctrl+2, i can toggle selecting and unselecting path

    by pressing ctrl+3, i can toggle selecting and unselecting text

    and to toggle it, it's just using an if statement, right? like if it's selectable then unselect...

    Thanks. 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    Hi zeroskills,

    Did you read my last post and the comments at the top of abShapeSelectionFilter.ils? The _whole point_ of the new code version was to implement this request!

    There are examples in the comments - for example:

    abShapeSelectionSetFilter(?togglePath t)

    Amongst others... No need for the form to be used.

    Regards,

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • zeroskills
    zeroskills over 15 years ago

    Thanks Andrew for your patience! Now it is really working for me!

    i was reading it but not sure what to do with it, so you previous reply was really helpful. i did this:

    hiSetBindKey("Layout" "Ctrl<Key>7" "abShapeSelectionSetFilter(?togglePath t)")

    and it does toggle the wire selectable/unslectable. also added this:

    hiSetBindKey("Layout" "Ctrl<Key>8" "abShapeSelectionSetFilter(?togglePolygon t)")
    hiSetBindKey("Layout" "Ctrl<Key>9" "abShapeSelectionSetFilter(?toggleText t)")
    hiSetBindKey("Layout" "Ctrl<Key>0" "abShapeSelectionSetFilter(?toggleText t ?togglePolygon t ?togglePath t)")

    so the polygon and text are toggleing the same as the wire, so i get it now. then i tried what if i did the selectable/unselectable for wire,polygon, text? so i did the last one...

    hiSetBindKey("Layout" "Ctrl<Key>0" "abShapeSelectionSetFilter(?toggleText t ?togglePolygon t ?togglePath t)")

    it does toggle from selectable/unselectable, but the only thing different is, when i want everything selectable, it doesn't "reset" the current state of the wire,polygon,text. for example,

    wire=unselectable, polygon=selectable, text=selectable

    when i tried this: hiSetBindKey("Layout" "Ctrl<Key>0" "abShapeSelectionSetFilter(?toggleText t ?togglePolygon t ?togglePath t)")

    wire=selectable, polygon=unselectable, text=unselectable

    could there be a separate code to do  selectable all and unselectable all? please correct me again if in the notes.

     

    But Thanks! The code really really works 100%! Thanks you very much, I hope you'll me again on my next request.

     

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • zeroskills
    zeroskills over 15 years ago

     Hi Andrew,

    Can you check  out the code again. I tried to reload it again because my cadence session crashed.

    load("/user/mel/abShapeSelectionFilter.ils")

    load("/user/me/abToggleForm.il")

    and use this bindkeys:

    hiSetBindKey("Layout" "Ctrl<Key>7" "abShapeSelectionSetFilter(?togglePath t)")
    hiSetBindKey("Layout" "Ctrl<Key>8" "abShapeSelectionSetFilter(?togglePolygon t)")
    hiSetBindKey("Layout" "Ctrl<Key>9" "abShapeSelectionSetFilter(?toggleText t)")
    hiSetBindKey("Layout" "Ctrl<Key>0" "abShapeSelectionSetFilter(?toggleText t ?togglePolygon t ?togglePath t)")

     

    and it doesn't work. i don't know why but it doesn't work now, but yesterday up to when i crashed, it was fine. 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    Re: [Custom IC SKILL Forum] Help on skill code for unselecting/selcting objects like path/wire, rectangle/polygon etc.

    Did you remember to load the third file, abLeMultiSelectionFilter.ils (filename from memory as I'm replying from a PDA)?

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • 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