Sample Function Flow
Often our users need to clip out many small windows from a large GDSII file in order to do some sort of yield or process analysis. To make matters more complicated, they may need to use two separate GDSII source layers and produce a third "derived" layer for the analysis. A common example of this might be a poly layer which is often defined using a base layer and a cut layer as shown below.
Let's set up the following example and see how QISMLIB and QISMBOOL can be used by a "client" to extract thousands of small windows from our GDSII data.
The Functional Flow
Below you will find a functional flow chart of which functions to call in the correct order. The flow will initialize the library, create an "exploder" instant, import the desired layers, set a clipping window and then place the extracted vectors from layer 33:0 into a memory buffer. A second exploder instance will be created and used to extract vectors into a separate buffer from layer 33:20.
Once both exploder threads are done, the QISMBOOL Boolean library will be used to clip and subtract the one set from the other and produce a third set of vectors in memory that the client program can use for its analysis.
[ Click on a function box to get some details about why it is used, what parameters are passed to it and what gets returned. ]
QisMLib_initialize_once: here's where the client initializes the library. Parameter's include the full path to the library. License is checked; and if not available a Null will be returned instead of a handle.
Load_file - this scans the input file, builds a quad tree and generally loads the data into memory. For clip applications, one typically would load only layers to be clipped - this reduced the memory footprint and speeds up the load time.
Create Exploder - The exploder is the function that traverses the data base and extracts any paths and boundaries that "cross" the selection window. Because QisLib_MT is multi-threaded, the client can create a number of exploder instances. This is most useful when extracting small amounts of data from very large files.
Get_Vector_Data - this launches the traversal of our first instance through the database. Vectors (our fancy name for polygons or boundaries) are collected by a client call back function. In this particular example, those vectors are simply stored in memory. We are not expecting too many vectors in a 10 x 10 um windows - maybe 10K-25K boundaries and 100K to 400K total vertices.
Qn_qismt_vector A - This is a client call back function used to collect the vectors produced by the exploder and do "something" with them. In this case, "something" is merely adding them to memory as they come in. For other applications that "something" could be processing or transmitting vectors to another workstation or to custom hardware through a data channel. The number of vectors returned for any given clip window is unknown as is the time it will take.
Create Exploder B - While Exploder A is extracting geometries from layer 33:0, we will create a second exploder instance whose job is to extract geometries from layer 33:20. As the GDSII file and its quad tree are already loaded and in memory, there is no overhead (as compared to reloading the database.)
Set_exact_window - within the second exploder instance we define our clipping window. In this example it is the same as the clipping window for Group A. If you did not need to process multiple layers, this second exploder could be working on a different region of the chip.
Create New Thread (B) - the client creates a second child thread for the second instance of the exploder to traverse through the database. This time it will be collecting geometries on layer 33:20 instead of 33:0.