A.3 Updating Data of a Wafer
After a simulation is finished the Wafer object must be updated with the
results prior to dumping it to a file. Depending on the process-step at hand
there are different approaches to achieve this update:
- Topography and topology did not change. This is the simplest
possible case. It is used for diffusion and device simulations without grid
refinement or grid relaxation. Only the values of the attributes were changed
during the simulation. Each existing attribute is updated point-wise. A
callback object must be provided by the simulator. This object returns the
attribute value for each given point. The WAFER-STATE-SERVER uses this callback object to
retrieve the attribute value for all points of the attribute to update. The
callback object must be derived from the interface AttributeUpdater
(defined in attr.hh) and implement the method
AttributeUpdater::getVal. Fig. A.5 and
Fig. A.6 depict the declarations and instantiation of the
necessary classes, objects, and methods and a code snippet to illustrate this
case. After all attributes were updated properly, the WAFER-STATE-SERVER removes
attributes that were invalidated during the simulation.
(c. f. Section 3.1).
- Surface of Wafer was not changed. Points were inserted along
edges. This is the case for diffusion simulations with
adaptive grid refinement turned on during the simulation. In this case a new
locater (grid) must be instantiated for each segment that was treated by
the simulator. The simulator must loop over all attributes of the segment
and instantiate a new quantity that holds the new values. The old locater and
quantity of the Wafer must than be replaced by the new
ones. Fig. A.7 depicts that case.
- Topology was changed. Surface of Wafer was not changed. This
is the case for diffusion simulations with the grid relaxation mechanism
turned on. Grid relaxation tries to move the points to increase the mesh
quality. No extra points are inserted during the simulation. As with
(2) for each segment and attribute that was queried by the
simulator a new locater and quantity must be instantiated
respectively. Additionally, values from attributes that were not queried by
the simulator must be interpolated from the old grid to the new (relaxed)
one. The method Quantity::replaceLocater takes care of interpolating
the values of a quantity (c. f. Fig. A.8).
- Topography was changed. This is by far the most demanding update
operation. It occurs in all kind of etching, deposition or oxidation
simulations. The existing segments of the Wafer must be merged with the
surface generated by the simulator. An operation that merges the surface of
the input Wafer with the surface that results from the simulation is
necessary (c. f. Section 2.2.2). The WAFER-STATE-SERVER uses the GNU TRIANGULATED SURFACES library
(GTS)  to perform the geometrical operations. Both, the existing
and the new surface are copied into the GTS data-structures. The desired
boolean operation is performed and the result is copied back to the Wafer.
Updating points of a
Wafer attribute. The class Grid3DAttributeUpdater is used in
the FEDOS simulator to update attributes from diffusion simulations
with grid refinement turned off. The class holds some FEDOS internal
information (wpt2pt3d, segInd, offset) to find the attribute's
value at any given point.
An object of type
Grid3DAttributeUpdater is instantiated and passed to the
update method of the attribute class. The WAFER-STATE-SERVER calls the method
getVal of this object to retrieve all attribute values.
Updating a refined Wafer.
The above code sequence must be applied for each segment and
attribute retrieved from the Wafer. The function
castToQuantity is used to cast the abstract class Attr to
the concrete class Quantity. The functions fillWafPoints
and buildLocater are examples from the FEDOS simulator
(c. .f. Section 4.2). locaters, a map to translate FEDOS points into Wafer Points and
an attribute index. These data are are then used in the method
Segment::replaceQuantity to create a new quantity on the
given locater. The index wafAttInd is used internally to uniquely
identify a quantity.
Updating a deformed Wafer.
As with refined mesh update, this code sequence must be applied for each
segment and attribute queried by the simulator. The only difference
to the refined mesh update is the invocation of
Quantity::replaceLocater instead of