Skip to content

Latest commit

 

History

History
1030 lines (803 loc) · 31.5 KB

pwio-utils.md

File metadata and controls

1030 lines (803 loc) · 31.5 KB

| README.md | pwio-cell.md |

glyph-pwio::utils

Copyright 2021 Cadence Design Systems, Inc. All rights reserved worldwide.

A collection of utility procs.

Table Of Contents

Namespace pwio::utils

All of the procs in this collection reside in the pwio::utils namespace.

To call a proc in this collection, you must prefix the proc name with a pwio::utils:: namespace specifier.

For example:

pwio::utils::entBaseType $ent

Library Reference pwio::utils

pwio::utils::assert { cond msg {exitVal -1} }

Asserts that cond evaluates to true. If false, msg is displayed and the script is terminated returning exitVal.

cond
The condition to test.
msg
The message to display if cond evaluates to false.
exitVal
The fail exit value. If 0, the script will not exit and execution will continue.

Usage:

package require PWI_Glyph 2.17.0
source [file join [file dirname [info script]] ".." "pwio.glf"]

if { ![pwio::utils::getSelection Block selectedEnts errMsg] } {
    puts $errMsg
    exit 0;
}
foreach ent $selectedEnts {
	set ndx 99
	pwio::utils::assert "$ndx >= 1 && $ndx < [$ent getPointCount]" \
						"Bad Index $ndx for '[$ent getName]'"
}

# Output (if assert fails):
# assert failed: (99 >= 1 && 99 < 36)
# message      : Bad Index 99 for 'blk-4'

pwio::utils::entBaseType { ent {subTypeVarName ""} }

Returns ent's base grid entity type.

ent
A grid entity.
subTypeVarName
If provided, ent's subtype is stored in this variable.

Base grid types are one of Node, Connector, Domain, or Block.

For blocks, the subtype will be one of Structured, Unstructured or Extruded.

For domains, the subtype will be one of Structured or Unstructured.

For connectors, the subtype is set to Connector.

For nodes, the subtype is set to Node.

Usage:

package require PWI_Glyph 2.17.0
source [file join [file dirname [info script]] ".." "pwio.glf"]

foreach selType {Block Domain Connector} {
    if { ![pwio::utils::getSelection $selType selectedEnts errMsg] } {
        puts $errMsg
        continue;
    }
    puts "$selType selection:"
    foreach ent $selectedEnts {
        set baseType [pwio::utils::entBaseType $ent subType]
        puts "  [$ent getName]($ent) baseType='$baseType' subType='$subType'"
    }
}

# Output:
# Block selection:
#   blk-4(::pw::BlockStructured_1) baseType='Block' subType='Structured'
#   blk-5(::pw::BlockStructured_2) baseType='Block' subType='Structured'
# Domain selection:
#   dom-14(::pw::DomainUnstructured_2) baseType='Domain' subType='Unstructured'
#   dom-27(::pw::DomainStructured_14) baseType='Domain' subType='Structured'
# Connector selection:
#   con-44(::pw::Connector_20) baseType='Connector' subType='Connector'
#   con-56(::pw::Connector_33) baseType='Connector' subType='Connector'

pwio::utils::getBlockFaces { blk }

Returns an list of blk's face entities.

blk
A block entity.

The returned list contains pw::Face entities.

For usage, see Example 2.


pwio::utils::getBlockDomains { blk }

Returns blk's domains as a list of pw::Domain entities. It is possible for a domain to appear in the list more than once.

blk
A block entity.

For usage, see Example 2.


pwio::utils::getFaceDomains { face }

Returns face's domains as a list of pw::Domain entities. It is possible for a domain to appear in the list more than once.

face
A face entity.

For usage, see Example 2.


pwio::utils::getFaceEdges { face }

Returns face's edges as a list of pw::Edge entities. The first edge is face's outer loop. Any additional edges are inner loops (holes).

face
A face entity.

For usage, see Example 2.


pwio::utils::getEdgeConnectors { edge }

Returns edge's connectors as a list of pw::Connector entities. It is possible for a connector to appear in the list more than once.

edge
An edge entity.

For usage, see Example 2.


pwio::utils::getFaceEdgeConnectors { face }

Returns face's connectors as a list of pw::Connector entities. It is possible for a connector to appear in the list more than once.

face
A face entity.

pwio::utils::getPerimeterPointCount { ent }

Returns the number of grid points on ent's outer perimeter. This count includes any holes or voids. Nodes will always return 0. Connectors will always return 2.

ent
A grid entity.

ent must be a pw::Node, pw::Connector, pw::Domain, pw::Face or pw::Block entity.

For usage, see Example 2.


pwio::utils::getOwnedPointCount { ent }

Returns the number of grid points on ent's interior (non-perimeter points). Nodes will always return 1.

ent
A grid entity.

ent must be a pw::Node, pw::Connector, pw::Domain, pw::Face or pw::Block entity.

For usage, see Example 2.


pwio::utils::isBndryEnt { ent allEnts }

Returns true if ent lies on the boundary of allEnts.

ent
A grid entity.
allEnts
A list of grid entites.

An error will occur if ent is anything other than a pw::Connector entity in 2D and anything other than a pw::Domain entity in 3D.

For usage, see Example 2.


pwio::utils::getNodeDbEnt { node dbEntVarName }

Returns true if node is constrained to a DB entity.

node
A node entity.
dbEntVarName
Required. If constrained, the DB entity is stored in this variable.

node must be a pw::Node entity.


pwio::utils::entLockInterior { ent }

Locks ent's grid points.

ent
A grid entity.

A corresponding call to pwio::utils::entUnlockInterior must be made when finished.

Locking and unlocking entities is typically not needed in scripts using pwio. Locking and unlocking is already performed by pwio::beginIO and pwio::endIO respectively.

Locking interior points improves I/O performance. A locked entity cannot be changed until it is unlocked. Consequently, Pointwise is able to skip potentially expensive data operations when accessing locked entities. Currently, only unrefined, structured blocks benefit from locking. However, more entity types may use locking in the future.

Usage:

pwio::utils::entLockInterior $ent
# do something with $ent
pwio::utils::entUnlockInterior $ent

pwio::utils::entUnlockInterior { ent {clearAllLocks 0} }

Unlocks ent's grid points.

ent
A grid entity previously locked with a call to pwio::utils::entLockInterior.
clearAllLocks
If 1, all active locks on ent will be released.

Under normal circumstances, clearAllLocks should be 0.

For usage and more information about entity locking, see pwio::utils::entLockInterior.


pwio::utils::ijkToIndexStructured { ijk ijkdim }

Returns the linear index corresponding to ijk within the given ijkdim extents.

ijk
The ijk index list to convert.
ijkdim
A list defining the full structured extents used for conversion.

This proc does not check if ijk lies within the given ijkdim extents. If ijk is invalid, the returned index is invalid.

The reverse mapping is done with pwio::utils::indexToIjkStructured.

Usage:

package require PWI_Glyph 2.17.0
source [file join [file dirname [info script]] ".." "pwio.glf"]

proc doit { ijk ijkdim } {
    # do a round-trip mapping from ijk to ndx and back to ijk
    set ndx [pwio::utils::ijkToIndexStructured $ijk $ijkdim]
    set ijk2 [pwio::utils::indexToIjkStructured $ndx $ijkdim]
    puts [format "\{%s\} ::> %3s ::> \{%s\}" $ijk $ndx $ijk2]
}

# Define the ijkdim index space (indices 1..max)
set ijkdim [list 5 4 3]
lassign $ijkdim imax jmax kmax
puts "Using ijkdim \{$ijkdim\}"
for {set k 1} {$k <= $kmax} {incr k} {
    for {set j 1} {$j <= $jmax} {incr j} {
        for {set i 1} {$i <= $imax} {incr i} {
            doit [list $i $j $k] $ijkdim
        }
    }
}
# this will fail
puts "bad ijk \{[list $i $j $k]\}"
doit [list $i $j $k] $ijkdim

# Output:
# Using ijkdim {5 4 3}
# {1 1 1} ::>   1 ::> {1 1 1}
# {2 1 1} ::>   2 ::> {2 1 1}
#    ...SNIP...
# {4 4 3} ::>  59 ::> {4 4 3}
# {5 4 3} ::>  60 ::> {5 4 3}
# bad ijk {6 5 4}
# assert failed: (86 > 0 && 86 <= (5 * 4 * 3))
# message      : indexToIjkStructured: Invalid ndx (86)

pwio::utils::indexToIjkStructured { ndx ijkdim }

Returns the ijk index corresponding to ndx within the given ijkdim extents.

ndx
The linear index to convert.
ijkdim
A list defining the full structured extents used for conversion.

The reverse mapping is done with pwio::utils::ijkToIndexStructured.

For usage, see pwio::utils::ijkToIndexStructured.


pwio::utils::entIjkToIndex { ent ijk }

Returns ent's linear index that corresponds to ijk.

ent
A grid entity.
ijk
The ijk index list to convert.

The reverse mapping is done with pwio::utils::entIndexToIjk.

Usage:

package require PWI_Glyph 2.17.0
source [file join [file dirname [info script]] ".." "pwio.glf"]

proc doit { blk ijk } {
    # do a round-trip mapping from ijk to ndx and back to ijk
    set ndx [pwio::utils::entIjkToIndex $blk $ijk]
    set ijk2 [pwio::utils::entIndexToIjk $blk $ndx]
    puts [format "\{%s\} ::> %3s ::> \{%s\}" $ijk $ndx $ijk2]
}

if { ![pwio::utils::getSelection Block blks errMsg] } {
    puts $errMsg
    exit 0
}
foreach blk $blks {
    set ijkdim [$blk getDimensions]
    lassign $ijkdim imax jmax kmax
    puts "--- [$blk getName] ($blk) dim\{$ijkdim\} ---"
    for {set k 1} {$k <= $kmax} {incr k} {
        for {set j 1} {$j <= $jmax} {incr j} {
            for {set i 1} {$i <= $imax} {incr i} {
                doit $blk [list $i $j $k]
            }
        }
    }
    puts ""
}
puts "bad ijk \{[list $i $j $k]\}"

# This will throw a TCL Glyph error if last block is structured.
# This will pwio::utils::assert{} if last block is unstructured.
doit $blk [list $i $j $k]

# Output:

# --- blk-4 (::pw::BlockStructured_1) dim{3 4 3} ---
# {1 1 1} ::>   1 ::> {1 1 1}
# {2 1 1} ::>   2 ::> {2 1 1}
#    ...SNIP...
# {2 4 3} ::>  35 ::> {2 4 3}
# {3 4 3} ::>  36 ::> {3 4 3}
# 
# --- blk-5 (::pw::BlockStructured_2) dim{3 4 3} ---
# {1 1 1} ::>   1 ::> {1 1 1}
# {2 1 1} ::>   2 ::> {2 1 1}
#    ...SNIP...
# {2 4 3} ::>  35 ::> {2 4 3}
# {3 4 3} ::>  36 ::> {3 4 3}
# 
# --- blk-1 (::pw::BlockUnstructured_1) dim{92 1 1} ---
# {1 1 1} ::>   1 ::> {1 1 1}
# {2 1 1} ::>   2 ::> {2 1 1}
#    ...SNIP...
# {91 1 1} ::>  91 ::> {91 1 1}
# {92 1 1} ::>  92 ::> {92 1 1}
# 
# bad ijk {93 2 2}

# ----- TCL TRACE -----
# ERROR: value outside the range [(1,1,1),(3,4,3)]
# ERROR: usage (argument 2): ::pw::BlockStructured_1 getLinearIndex ijk_index
#    OR
# assert failed: (93 >= 1 && 93 <= 92)
# message      : entIndexToIjk: Bad Index 93 for ::pw::BlockUnstructured_1

pwio::utils::entIndexToIjk { ent ndx }

Returns ent's ijk index that corresponds to ndx.

ent
A grid entity.
ndx
The linear index to convert.

The reverse mapping is done with pwio::utils::entIjkToIndex.

For usage, see pwio::utils::entIjkToIndex.


pwio::utils::makeCoord { ent ijk }

Returns a grid coord for the given ent and ijk.

ent
A grid entity.
ijk
An ijk index list.

Usage:

# $strBlk is a 5x5x5 structured block
set sCoord [pwio::utils::makeCoord $strBlk {3 2 1}]

# $unsBlk is a 128 point unstructured block
set uCoord [pwio::utils::makeCoord $unsBlk {64 1 1}]

pwio::utils::makeCoordFromIjkVals { ent i j k }

Returns a grid coord for the given ent and i, j and k index values.

ent
A grid entity.
i j k
The individual i, j and k index values.

Usage:

# $strBlk is a 5x5x5 structured block
set sCoord [pwio::utils::makeCoordFromIjkVals $strBlk 3 2 1]

# $unsBlk is a 128 point unstructured block
set uCoord [pwio::utils::makeCoordFromIjkVals $unsBlk 64 1 1]

pwio::utils::makeCoordFromEntIndex { ent ndx }

Returns a grid coord for the given ent and linear index.

ent
A grid entity.
ndx
A 1-based index relative to ent's index space.

Usage:

# $strBlk is a 5x5x5 structured block
set sCoord [pwio::utils::makeCoordFromEntIndex $strBlk 8]

# $unsBlk is a 128 point unstructured block
set uCoord [pwio::utils::makeCoordFromEntIndex $unsBlk 64]

pwio::utils::sortEntsByType { ents }

Returns a list containing ents in base type sorted order.

ents
The list of grid entites to sort.

The returned list will be in Block, Domain, Connector, Node order.

For usage, see Example 1.


pwio::utils::pointToString { pt }

Returns a string representation of pt.

pt
A grid point list.

pt is a grid point.

The resulting string will be one of "{x y z}" or "{u v dbEnt}".


pwio::utils::xyzEqual { xyz1 xyz2 {tol 1e-8} }

Returns true if two xyz points are equal within the given tolerance.

xyz1
First point as an {x y z} list.
xyz2
Second point as an {x y z} list.
tol
The optional comparison tolerance.

Usage:

# default tolerance
puts [pwio::utils::xyzEqual {1.0 2.0 3.0} {1.1 2.0 3.0}]

# 0.2 tolerance
puts [pwio::utils::xyzEqual {1.0 2.0 3.0} {1.1 2.0 3.0} 0.2]

# Output:
# 0
# 1

pwio::utils::valEqual { val1 val2 {tol 1e-8} }

Returns true if two values are equal within the given tolerance.

val1
First value.
val2
Second value.
tol
The optional comparison tolerance.

Usage:

# default tolerance
puts [pwio::utils::valEqual 1.0 1.1]

# 0.2 tolerance
puts [pwio::utils::valEqual 1.0 1.1 0.2]

# Output:
# 0
# 1

pwio::utils::coordToPtString { coord }

Returns a string representation of a grid coord.

coord
The grid coord.

Usage:

# $unsBlk is a 128 point unstructured block
set coord [pwio::utils::makeCoordFromEntIndex $unsBlk 64]
puts [pwio::utils::coordToPtString $coord]

# Output if coord is not DB constrained:
# {1.0 2.0 3.0}

# Output if coord is DB constrained:
# {1.0 2.0 3.0} @ {0.73 0.48 ::pw::Blockunstructured_1}

pwio::utils::vcToString { vc }

Returns a string representation of a pw::VolumeCondition.

vc
The volume condition.

The resulting string format will be "vcName vcId vcPhysicalType"

Usage:

# "myVC" must exist
set vc [pw::VolumeCondition getByName "myVC"]
puts "'[pwio::utils::vcToString $vc]'"

# Output:
# 'myVC 3 Wall'

pwio::utils::labelPt { ndx pt }

Returns a pw::Note entity positioned at pt.

ndx
The note text value.
pt
The note's position.

This proc is primarily used for debugging.

Usage:

pwio::utils::labelPt 3 {1.0 2.0 3.0}
pwio::utils::labelPt "hello" {10.0 2.0 3.0}

pwio::utils::printEntInfo { title ents {dim 0} {allEnts {}} }

Dumps a table of information about ents.

title
The dump's title string.
ents
A list of grid entites to dump.
dim
The optional dimensionality used for the dump. If specified, it must be 2 or 3.
allEnts
An optional list of grid entites used to classify the dumped entities as either a boundary or connection.

allEnts is ignored if dim is 0.

For usage, see Example 1.


pwio::utils::getSelection { selType selectedVarName errMsgVarName }

Prompts the user and returns true if one or more entities have been selected.

selType
The entity base type to select.
selectedVarName
Required. The selected entities are stored in this variable.
errMsgVarName
Required. If false is returned, a failure message is stored in this variable.

The valid selType values are Connector, Domain, Block, Database, Spacing or Boundary.

Only visible and enabled entities are considered for selection.

If only 1 entity of the the given selType is selectable, it is returned without prompting the user.

See also, pwio::getSelectType.

For usage, see Example 1, Example 2, pwio::utils::entBaseType.


pwio::utils::getSupportEnts { ents supEntsVarName {addEnts false}}

Returns true if the number of unique support entities stored in supEntsVarName is greater than 0.

ents
A list of grid entites for which to get support entities.
supEntsVarName
Required. The lower level support entities are stored in this variable.
addEnts
If true, ents will also be added to supEntsVarName.

A support entity is any lower level grid entity used to construct a higher level grid entity.

A pw::Domain's support entities are its defining pw::Connectors and pw::Nodes.

A pw::Block's support entities are its defining pw::Domains, pw::Connectors and pw::Nodes.

Only pw::Domains, pw::Connectors and pw::Nodes can be support entities.

Shared support entities are only included in supEntsVarName once.

For usage, see Example 1.

Example Usage

The output for these examples was generated from the grid file example.pw.

The example grid

Example 1

package require PWI_Glyph 2.17.0
source [file join [file dirname [info script]] ".." "pwio.glf"]

proc nm { ent } {
    if { "" != "$ent" } {
        return [$ent getName]
    }
    return ""
}

proc dumpEnts { title ents } {
    puts ""
    puts "$title"
    while { 0 != [llength $ents] } {
        set ents [lassign $ents ent1 ent2 ent3 ent4 ent5 ent6 ent7 ent8 ent9 ent10]
        puts [format "%8s %8s %8s %8s %8s %8s %8s %8s" \
            [nm $ent1] [nm $ent2] [nm $ent3] [nm $ent4] [nm $ent5] \
            [nm $ent6] [nm $ent7] [nm $ent8] [nm $ent9] [nm $ent10]]
    }
}

set dim [pwio::getCaeDim]
puts "CAE Dimension : $dim"

set selType [pwio::getSelectType]
puts "Selection Type: $selType"

if { ![pwio::utils::getSelection $selType selectedEnts errMsg] } {
    puts $errMsg
} elseif { ![pwio::utils::getSupportEnts $selectedEnts selAndSupEnts true] } {
    puts "pwio::utils::getSupportEnts failed"
} else {
    dumpEnts "UNSORTED:" $selAndSupEnts
    dumpEnts "SORTED:" [pwio::utils::sortEntsByType $selAndSupEnts]
    puts ""
    pwio::utils::printEntInfo "TEST" $selAndSupEnts $dim $selectedEnts
}

Output:

CAE Dimension : 3
Selection Type: Block

UNSORTED:
  Node_4   Node_5   Node_6   Node_7   Node_8   dom-23   dom-24   Node_9
  dom-26    blk-5   dom-27   dom-28   dom-29  Node_10  Node_11  Node_12
  con-26   con-27   con-28   con-19   con-40   con-41   con-42   con-43
  con-46    con-1   con-47   con-48   con-49   con-50   con-51   con-52
  dom-11   con-55   con-56   con-57   dom-20   dom-21    dom-1   dom-22
  Node_3                                                               

SORTED:
   blk-4    blk-5   dom-23   dom-24   dom-25   dom-26   dom-27   dom-28
  dom-20   dom-21    dom-1   dom-22   con-26   con-27   con-28   con-19
  con-42   con-43   con-44   con-45   con-46    con-1   con-47   con-48
  con-51   con-52   con-53   con-54   con-55   con-56   con-57   Node_4
  Node_7   Node_8   Node_9  Node_10  Node_11  Node_12  Node_13  Node_14
  Node_3                                                               

TEST
| Entity                      | Name       |   NumPts |  DbPts | Dim     | BaseType   | BorC  |
| --------------------------- | ---------- | -------- | ------ | ------- | ---------- | ----- |
| ::pw::BlockStructured_1     | blk-4      |       36 |        | 3 4 3   | Block      |       |
| ::pw::BlockStructured_2     | blk-5      |       36 |        | 3 4 3   | Block      |       |
| ::pw::DomainStructured_10   | dom-23     |        9 |        | 3 3     | Domain     | Bndry |
| ::pw::DomainStructured_11   | dom-24     |       12 |      1 | 4 3     | Domain     | Bndry |
...SNIP...
| ::pw::DomainStructured_8    | dom-1      |       12 |        | 3 4     | Domain     | Cnxn  |
| ::pw::DomainStructured_9    | dom-22     |        9 |        | 3 3     | Domain     | Bndry |
| ::pw::Connector_10          | con-26     |        4 |        | 4       | Connector  |       |
| ::pw::Connector_11          | con-27     |        3 |      3 | 3       | Connector  |       |
...SNIP...
| ::pw::Connector_28          | con-51     |        4 |        | 4       | Connector  |       |
| ::pw::Connector_29          | con-52     |        3 |      1 | 3       | Connector  |       |
| ::pw::Connector_30          | con-53     |        3 |        | 3       | Connector  |       |
| ::pw::Connector_31          | con-54     |        3 |        | 3       | Connector  |       |
| ::pw::Connector_32          | con-55     |        3 |      1 | 3       | Connector  |       |
| ::pw::Connector_33          | con-56     |        3 |        | 3       | Connector  |       |
| ::pw::Connector_34          | con-57     |        4 |        | 4       | Connector  |       |
| ::pw::Node_4                | Node_4     |        1 |      1 | 1       | Node       |       |
...SNIP...
| ::pw::Node_2                | Node_2     |        1 |        | 1       | Node       |       |
| ::pw::Node_3                | Node_3     |        1 |      1 | 1       | Node       |       |

Example 2

package require PWI_Glyph 2.17.0
source [file join [file dirname [info script]] ".." "pwio.glf"]

if { ![pwio::utils::getSelection Block blks errMsg] } {
    puts $errMsg
    exit 0
}
foreach blk $blks {
    set perimPtCnt [pwio::utils::getPerimeterPointCount $blk]
    set ownedPtCnt [pwio::utils::getOwnedPointCount $blk]
    puts "--------------------------------------------------------------------"
    puts "BLOCK [$blk getName] ($blk) | perim $perimPtCnt | owned $ownedPtCnt"
    set doms [pwio::utils::getBlockDomains $blk]
    foreach dom $doms {
        if { [pwio::utils::isBndryEnt $dom $blks] } {
            set domUsage "Boundary"
        } else {
            set domUsage "Connection"
        }
        set perimPtCnt [pwio::utils::getPerimeterPointCount $dom]
        set ownedPtCnt [pwio::utils::getOwnedPointCount $dom]
        puts "  BLOCK DOM [$dom getName]($dom) | perim $perimPtCnt | owned $ownedPtCnt | usage $domUsage"
    }

    set faces [pwio::utils::getBlockFaces $blk]
    foreach face $faces {
        set perimPtCnt [pwio::utils::getPerimeterPointCount $face]
        set ownedPtCnt [pwio::utils::getOwnedPointCount $face]
        puts "  BLOCK FACE $face | perim $perimPtCnt | owned $ownedPtCnt"
        set doms [pwio::utils::getFaceDomains $face]
        foreach dom $doms {
            puts "    FACE DOM [$dom getName] ($dom)"
        }
        set edges [pwio::utils::getFaceEdges $face]
        foreach edge $edges {
            puts "    FACE EDGE $edge"
            set cons [pwio::utils::getEdgeConnectors $edge]
            foreach con $cons {
                set perimPtCnt [pwio::utils::getPerimeterPointCount $con]
                set ownedPtCnt [pwio::utils::getOwnedPointCount $con]
                puts "      EDGE CON [$con getName] ($con) | perim $perimPtCnt | owned $ownedPtCnt"
            }
        }
    }
    puts ""
}

Output:

--------------------------------------------------------------------
BLOCK blk-4 (::pw::BlockStructured_1) | perim 34 | owned 2
  BLOCK DOM dom-11(::pw::DomainStructured_3) | perim 10 | owned 2 | usage Connection
  BLOCK DOM dom-28(::pw::DomainStructured_15) | perim 10 | owned 2 | usage Boundary
  BLOCK DOM dom-22(::pw::DomainStructured_9) | perim 8 | owned 1 | usage Boundary
  BLOCK DOM dom-24(::pw::DomainStructured_11) | perim 10 | owned 2 | usage Boundary
  BLOCK DOM dom-26(::pw::DomainStructured_13) | perim 8 | owned 1 | usage Boundary
  BLOCK DOM dom-1(::pw::DomainStructured_8) | perim 10 | owned 2 | usage Boundary
  BLOCK FACE ::pw::FaceStructured_1 | perim 10 | owned 0
    FACE DOM dom-11 (::pw::DomainStructured_3)
    FACE EDGE ::pw::Edge_67
      EDGE CON con-19 (::pw::Connector_3) | perim 2 | owned 1
    FACE EDGE ::pw::Edge_68
      EDGE CON con-26 (::pw::Connector_10) | perim 2 | owned 2
    FACE EDGE ::pw::Edge_69
      EDGE CON con-27 (::pw::Connector_11) | perim 2 | owned 1
    FACE EDGE ::pw::Edge_70
      EDGE CON con-28 (::pw::Connector_12) | perim 2 | owned 2
...SNIP...
  BLOCK FACE ::pw::FaceStructured_6 | perim 10 | owned 0
    FACE DOM dom-1 (::pw::DomainStructured_8)
    FACE EDGE ::pw::Edge_87
      EDGE CON con-1 (::pw::Connector_23) | perim 2 | owned 1
    FACE EDGE ::pw::Edge_88
      EDGE CON con-51 (::pw::Connector_28) | perim 2 | owned 2
    FACE EDGE ::pw::Edge_89
      EDGE CON con-54 (::pw::Connector_31) | perim 2 | owned 1
    FACE EDGE ::pw::Edge_90
      EDGE CON con-57 (::pw::Connector_34) | perim 2 | owned 2

--------------------------------------------------------------------
BLOCK blk-1 (::pw::BlockUnstructured_1) | perim 48 | owned 44
  BLOCK DOM dom-8(::pw::DomainUnstructured_1) | perim 10 | owned 4 | usage Boundary
  BLOCK DOM dom-9(::pw::DomainStructured_1) | perim 10 | owned 2 | usage Boundary
  BLOCK DOM dom-10(::pw::DomainStructured_2) | perim 10 | owned 2 | usage Boundary
  BLOCK DOM dom-11(::pw::DomainStructured_3) | perim 10 | owned 2 | usage Connection
  BLOCK DOM dom-12(::pw::DomainStructured_4) | perim 10 | owned 2 | usage Boundary
  BLOCK DOM dom-13(::pw::DomainStructured_5) | perim 10 | owned 2 | usage Boundary
  BLOCK DOM dom-14(::pw::DomainUnstructured_2) | perim 10 | owned 4 | usage Boundary
  BLOCK FACE ::pw::FaceUnstructured_1 | perim 0 | owned 0
    FACE DOM dom-8 (::pw::DomainUnstructured_1)
    FACE DOM dom-9 (::pw::DomainStructured_1)
    FACE DOM dom-10 (::pw::DomainStructured_2)
    FACE DOM dom-11 (::pw::DomainStructured_3)
    FACE DOM dom-12 (::pw::DomainStructured_4)
    FACE DOM dom-13 (::pw::DomainStructured_5)
    FACE DOM dom-14 (::pw::DomainUnstructured_2)

Disclaimer

This file is licensed under the Cadence Public License Version 1.0 (the "License"), a copy of which is found in the LICENSE file, and is distributed "AS IS." TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, CADENCE DISCLAIMS ALL WARRANTIES AND IN NO EVENT SHALL BE LIABLE TO ANY PARTY FOR ANY DAMAGES ARISING OUT OF OR RELATING TO USE OF THIS FILE. Please see the License for the full text of applicable terms.