Question: Could you please help me with the following script?

It is a Tcl script which Synopsys IC Compiler II will source.

```none
set_dont_use [get_lib_cells */*CKGT*0P*] -power
set_dont_use [get_lib_cells */*CKTT*0P*] -setup

```

May I know how to take only `*/*CKGT*0P*` and `*/*CKTT*0P*` and assign these to a variable.

Answer: 
Of course you can treat a Tcl script as something you search through; it's just a file with text in it after all.

Let's write a script to select the text out. It'll be a Tcl script, of course. For readability, I'm going to put the regular expression itself in a global variable; treat it like a constant. (In larger scripts, I find it helps a lot to give names to REs like this, as those names can be used to remind me of the *purpose* of the regular expression. I'll call it “`RE`” here.)

```
set f [open theScript.tcl]
# Even with 10 million lines, modern computers will chew through it rapidly
set lines [split [read $f] "\n"]
close $f

# This RE will match the sample lines you've told us about; it might need tuning
# for other inputs (and knowing what's best is part of the art of RE writing)
set RE {^set_dont_use \[get_lib_cells ([\w*/]+)\] -\w+$}

foreach line $lines {
    if {[regexp $RE $line -> term]} {
        # At this point, the part you want is assigned to $term
        puts "FOUND: $term"
    }
}

```

The key things in the RE above? It's *in braces* to reduce backslash-itis. Literal square brackets are backslashed. The bit in parentheses is the bit we're capturing into the `term` variable. `[\w*/]+` matches a sequence of one or more characters from a set consisting of “standard **w**ord characters” plus `*` and `/`.

The use of `regexp` has `->` as a funny name for a variable that is ignored. I could have called it `dummy` instead; it's going to have the whole matched string in it when the RE matches, but we already have that in `$term` as we're using a fully-anchored RE. But I like using `->` as a mnemonic for “assign the submatches into these”. Also, the formal result of `regexp` is the number of times the RE matched; without the `-all` option, that's effectively a boolean that is true exactly when there was a match, which is useful. Very useful.
To assign the output of any command `<command>` to a variable with a name `<name>`, use `set <name> [<command>]`:

```none
> set hello_length [string length hello]
5
> puts "The length of 'hello' is $hello_length."
The length of 'hello' is 5.

```

In your case, maybe this is what you want? (I still don't quite understand the question, though.)

```none
set ckgt_cells [get_lib_cells */*CKGT*0P*]
set cktt_cells [get_lib_cells */*CKTT*0P*]

```