This disclosure is generally related to testing of physical systems, such as digital Integrated Circuits (ICs). More specifically, this disclosure is related to a system and method for generating testing vectors that facilitate efficient testing of the physical systems.
Digital Integrated Circuits (ICs) are ubiquitously present in people's life, from washing machines to spaceships. Advances in the lithography technologies have enabled the feature size of the circuits to decrease continuously, thus facilitating the development of high-density ICs. However, as the feature size decreases, defects (e.g., due to impurities in the substrate, misalignments of masks, trembling during exposure, etc.) in ICs become more common and can lead to the malfunction of the circuits. Testing of the ICs is an important step to ensure the quality of the final product comprising the ICs. The increasing complexity of the ICs also increases the cost for testing. It is estimated that testing cost can be up to 40% of the total production cost of modern digital ICs.
One embodiment provides a method and a system for generating test vectors for testing a computational system. During operation, the system obtains a design of the computational system, the design comprising an original system. The system generates a design of a fault-augmented system block by adding a plurality of fault-emulating subsystems to the original system; generates a design of an equivalence-checking system based on the original system and the fault-augmented system block; encodes the design of the equivalence-checking system into a logic formula, with variables within the logic formula comprising inputs and outputs of the original system and inputs and outputs of the fault-augmented system block; and solves the logic formula to obtain a test vector used for testing at least one fault in the computational system.
In a variation on this embodiment, the design of the equivalence-checking system comprises the original system and one or more fault-augmented system blocks, and generating the design of the equivalence-checking system comprises: coupling the inputs of the original system to corresponding inputs of each fault-augmented system block and coupling the outputs of the original system and corresponding outputs of each fault-augmented system block to a comparison module.
In a further variation, the fault-augmented system block comprises a set of fault-assumable inputs. A respective fault-assumable input corresponds to a fault-emulating subsystem. Generating the design of the equivalence-checking system further comprises coupling the set of fault-assumable inputs to a first constraint system.
In a further variation, the first constraint system is configured to apply a constraint on the set of fault-assumable inputs to ensure that the fault-augmented system block simulates one fault.
In a further variation, generating the design of the equivalence-checking system further comprises coupling the fault-assumable inputs in the one or more fault-augmented system block to a second constraint system. The second constraint system is configured to apply a constraint to ensure that different fault-augmented system blocks have different sets of fault-assumable inputs.
In a further variation, generating the design of the equivalence-checking system comprises adding one fault-augmented system block at a time until there is no satisfying solution to the logic formula.
In a further variation, the system generates a design of an extended system, which includes the equivalence-checking system and at least one copy of the equivalence-checking system, and solves a logic formula corresponding to the design of the extended system. Generating the design of the extended system comprises coupling corresponding fault-assumable inputs from different fault-augmented system blocks of each of the equivalence-checking systems to a third constraint system configured to apply a constraint to ensure that an arbitrary fault is simulated by at least one fault-augmented system block.
In a further variation, generating the design of the extended system comprises adding one copy of the equivalence-checking system at a time until a satisfying solution to the logic formula corresponding to the design of the extended system is found.
In a further variation, the satisfying solution to the logic formula corresponding to the design of the extended system comprises a plurality of sets of assignments to the inputs of the original systems included in the extended system. A respective set of assignments form a test vector, and test vectors corresponding to the plurality of sets of assignments form a test suite capable of testing any arbitrary fault in the computational system.
In a variation on this embodiment, the computational system comprises one or more of: a digital circuit; an analog circuit; a quantum circuit; a reversible computing circuit; an optical circuit; a quantum optical circuit; a processor; and a computer program.
In the figures, like reference numerals refer to the same figure elements.
The following description is presented to enable any person skilled in the art to make and use the embodiments, and is provided in the context of a particular application and its requirements. Various modifications to the disclosed embodiments will be readily apparent to those skilled in the art, and the general principles defined herein may be applied to other embodiments and applications without departing from the spirit and scope of the present disclosure. Thus, the present invention is not limited to the embodiments shown, but is to be accorded the widest scope consistent with the principles and features disclosed herein.
Embodiments described herein solve the technical problem of generating an optimal set of testing vectors for testing a digital circuit. During operation, the system receives the design of a to-be-tested circuit (i.e., the original, no fault circuit design) and designs a fault-augmented circuit block based on the original circuit design. The designed fault-augmented circuit block can include, in addition to the components in the original circuit design, subcircuits that can simulate potential faults in the circuit. The test system can further design a miter circuit using the original circuit design and the designed fault-augmented circuit block and convert the miter circuit design to a Boolean formula. This way, the problem of generating a testing vector becomes the problem of finding a satisfying solution (e.g., by using a SAT solver) to the Boolean formula. In some embodiment, an extended miter circuit can be designed in such a way that a test suite that can test potential single-faults in all components of the entire circuit can be generated by running the SAT solver once. When the extended miter circuit is properly designed, the test suite can include a minimum number of test vectors, thus significantly improving the testing efficiency. In addition to digital electrical circuits, the disclosed solution can also be used to generate test vectors for other types of physical systems, including but not limited to: mechanical systems, analog electrical systems, electro-optical systems, electro-mechanical systems, processors, reversible computing circuits, quantum circuits, optical circuits, quantum optical circuits, computer programs, etc. Depending on the physical system being tested, the miter can be constructed using the appropriate model of the non-fault system and the corresponding fault-augmented model.
A digital circuit design can be encoded as a Boolean formula, with the inputs and outputs of the circuit being variables in the Boolean formula. A multi-output Boolean function can be defined as a function ƒ:{0,1}m→{0,1}n for some {m,n}∈□. Common Boolean functions can include negation (NOT or ¬), conjunction (AND or ∧), disjunction (OR or ∨), exclusive or (XOR or ⊕), implication (→), and logical equivalence (↔).
Although similar in many ways, a Boolean circuit is different from a Boolean function. One of the most important differences is that circuits use bases while functions do not. A basis B can be regarded as the elementary unit of sharing or as an abstract component library. Unlike in the real world, though, each basis function can be used infinitely many times, and all functions in a basis have the same cost.
Given a basis B, a Boolean circuit C over B can be defined as C=<V, E, α, β, χ, ω>, where <V, E> is a finite directed acyclic graph, α: E→□ is an injective function, β: V→B ∪{*}, χ:V→{x1, x2, . . . , xn}∪{*}, and ω: V→{y1, y2, . . . , ym}∪{*}. Note that in this disclosure, symbol “→” is used for both implication and function mapping. For the above Boolean circuit C, a number of conditions must hold. If v∈V has an in-degree 0, then χ(v)∈{x1, x2, . . . , xn} or β(v) is a 0-ary Boolean function (i.e., a Boolean constant) in B. If v∈V has an in-degree k>0, then β(v) is a k-ary Boolean function from B. For every i, 1≤i≤n, there is exactly one node v∈V such that χ(v)=xi. For every i, 1≤i≤m, there is exactly one node v∈V such that ω(v)=yi. The function α determines the ordering of the edges that go into a Boolean function when the ordering matters (such as in implication). The function α is not necessary if B only includes symmetric functions. The function β determines the type (i.e., a function in the basis B) of each node in the circuit. The function χ specifies the set of input nodes {x1, x2, . . . , xn}. The function ω specifies the set of output nodes {y1, y2, . . . , ym}. A node v is non-output, or computations, if χ(v)* and ω(v)=*.
Fault library 304 includes various types of fault that require testing. In addition to the stuck-at faults (e.g., stuck-at-1 and stuck-at-0) commonly tested by conventional testing systems, fault library 304 can include additional types of fault, such as the wrong-component-type fault (e.g., a supposedly OR gate behaves like an AND gate or vice versa), the connection-failure fault (e.g., an open wire), the bridging fault (e.g., a shorted connection to the ground or other wires), etc.
Circuit augmentor 306 constructs a composite circuit design which can include all possible faults in the fault library. For example, potential faults can be simulated by augmenting the original circuit design using standard components in a component library (e.g., component library 100). The fault-augmented circuit design can have the same set of primary inputs and outputs as the original circuit design and can include a new set of assumable inputs, which allow a simulation system to simulate the effect of a fault by assigning values to them. SAT-solver-based generator 308 can include a SAT-solver that finds satisfying solutions to a Boolean formula corresponding to the fault-augmented circuit design. Test patterns for testing the to-be-tested physical circuit can be generated based on those satisfying solutions.
In addition to the stuck-at faults, the fault library includes other types of fault that can be simulated using an augmentation subcircuit. For example, a wrong-component-type fault refers to the situation when a particular type of gate behaves like a different type of gate. For example, an AND gate behaves like an OR gate, or vice versa. In some embodiments, to model such fault behavior, the system can automatically replace each gate in a circuit with a special kind of subcircuit, referred to as a universal component cell.
A universal component cell can be a Boolean circuit that can be configured to perform as any one of the gates in a component library (e.g., component libraries 100 and 200 shown in
By configuring the demultiplexers and multiplexers, universal component cell 500 can be configured to act as any one of the components included in the universal component cell. The configuration of universal component cell 500 can be a binary value assigned to a vector of selector lines s. The number of selector inputs is |s|=┌log2 n┐ for n distinct component types, meaning that the number of items in set s can be given as the smallest integer that is greater than or equal to log2(n)
Because the selector input determines the type of component the universal component cell represents, the assumable inputs for fault can be associated with the selector input depending on the circuit implementation. In addition to the stuck-at faults and the wrong-component-type fault, the system can also model other types of fault, such as the bringing fault or the open-wire fault, using known techniques. The scope of disclosure is not limited by the type of fault being modeled and the particular fault-modeling technique.
Regardless of the type of fault being modeled, at a higher level, the presence of a particular fault can be simulated by assigning appropriate values to the additional assumable inputs in the fault-augmented circuit design (e.g., stuck-at assumable inputs shown in
In this disclosure, the following notations are used: X denotes the set of primary inputs, Y denotes the set of primary outputs, and F denotes the set of fault-assumable (or assumable for short) inputs; an assignment ƒ=0 to a variable ƒ∈F denotes a lack of fault, and an assignment ƒ=1 to a variable ƒ∈F denotes the presence of a fault; and an assignment to all primary inputs in a circuit φ(X={0,1}|X|, F={0,1}|F|) produces an assignment to all primary outputs of φ. It can be shown that, if the circuit φ is well-formed and all primary inputs are assigned, there exists a polynomial-time algorithm that can compute the values of the primary outputs Y.
Given a fault-augmented circuit φ with primary inputs X, assumable inputs F, and a fault-assumable variable ƒ∈F, a test vector that tests ƒ is defined as an assignment X=χ, such that φ(X=χ, ƒ=0)≠φ(X=χ, ƒ=1). In other words, a test vector that tests a particular fault is an input that causes the circuit to generate different outputs for the no-fault situation and for the faulty situation. In rare circumstances, a test vector for a particular assumable input ƒ may not exist. However, in this disclosure, it is assumed that there always exists at least one test vector for each assumable input.
Given the circuit φ with primary inputs X, assumable inputs F, a test suite Λ is a set of test vectors such that, for any ƒ∈F, there exists at least one test vector χ∈Λ that tests ƒ.
In conventional approaches for automated test pattern generation (ATPG), given a circuit design, the ATPG system generates test vectors for testing faults at one component at a time. Considering modern circuits usually have a large number (sometimes can be trillions) of components, such a test-generation process can be inefficient and time consuming. To increase the test-generation efficiency, in some embodiments, the ATPG system can construct a miter structure and uses a SAT solver to solve a Boolean formula corresponding to the miter in order to generate test patterns for testing a circuit.
The word “miter” is short for “miter joint” and means two parts fastened together. In one miter construct, two (or more) circuits are given the same inputs and their outputs are forced to be different to simulate that a faulty circuit generates different outputs than the no-fault circuit. Encoding the circuit as a Boolean formula and leaving the inputs as unset literals, a SAT solver will find an assignment of binary values to all the input variables. These input values will cause the two circuits to have different outputs, meaning that the SAT solver has found a test-vector that distinguishes the two circuits. On the other hand, if the SAT solver reports UNSAT, then the two circuits are equivalent. Hence, a miter circuit can also be referred to as an equivalence checking circuit.
Output-comparison circuit 716 can compare the outputs of original circuit 712 and fault-augmented circuit 714. More specifically, Output-comparison circuit 716 can include a number of XOR gates for comparing individual pairs of outputs and an OR gate taking the outputs of the XOR gates as inputs. Any mismatch between the outputs of original circuit 712 and the outputs of fault-augmented circuit 714 can result in the output of output-comparison circuit 716 being “TRUE” or “1.”
As discussed previously, to compute a test vector for a particular fault ƒ, one can assign a Boolean vector where the only non-zero element is ƒ to F′ and use a SAT solver to compute values for X such that the output of output-comparison circuit 716 is TRUE. The computed values of X are the desired test vector that can be used to test the particular fault ƒ. To compute a test suite, one can use the SAT solver to find a solution for each fault location/assumable input to obtain n test vectors, where n=|F|. Note that some of the test vectors may be the same, meaning that the same test vector can be used to test different faults. In such a situation, the test suite is considered as compacted. A compacted test suite can reduce the number of test vectors needed for testing a circuit, thus decreasing the overall time needed for testing. It is desirable to generate a test suite that is compacted or having a reduced number of test vectors.
In some embodiments, in addition to a test vector for testing for a single-fault (i.e., fault at a single component or location) one location at a time, the system can also compute a single test vector that can test multiple single-faults in one run. More specifically, to do so, the constructed miter structure will have multiple fault emulation circuits (i.e., the fault-augmented circuit). For example, to generate a test vector that can test two single-faults, the miter structure can include three circuits: the original (or no-fault) circuit and two fault-augmented circuits, one for each single-fault. Note that a test vector that tests multiple single-faults is different from a test vector that tests multiple faults. In examples described in this disclosure, the system generates test vectors that can be used to test single-faults. However, the similar concept can also be used to develop a strategy for generating test vectors that can test multiple faults (e.g., double faults).
φi(Xi={0,1}|Xi|, Yi=={0,1}|Y
In some embodiments, the assumable inputs can have pre-assigned values to represent certain faults (e.g., a particular non-zero ƒ represents a fault at a particular component or location). In some embodiments, there can be no values assigned to the assumable inputs, and the SAT solver not only can find a test vector χ but also can find values of the unassigned variables in F (i.e., which faults can be tested using χ). In other words, without defining the fault locations ahead of time, the SAT solver can find a test vector and the corresponding faults that can be tested by the test vector. To do so, extra cardinality constraints are needed. More specifically, these constraints can guarantee the type of faults tested by the computed test vector. In some embodiments, the test-generating system generates test vectors that test single-faults, and constraints can be applied to the assumable inputs such that there is only one non-zero ƒ in F.
To ensure that each fault-augmented circuit can be used to test a unique fault (i.e., different circuit blocks have different assumable inputs), an additional constraint is needed.
There are various known techniques for implementing the “one” and “exactly k” constraints. In fact, the “one” constraint can be viewed as a special case for the “exactly k” constraint. Exemplary constraint circuits can include at-least one and at-most one combination of AND gates and OR gates, multi-operand adders, and sorting networks.
An n-bit multi-operand adder circuit adds n single-bit numbers. Multi-operand addition of single-bit numbers is also known as bit-counting or binary vector addition and has found applications in circuit implementations of the “at least k” or “at most k” constraints.
Under certain circumstances, it is more computationally advantageous to use unary instead of binary arithmetic. In such situations, the multi-operand adder described above can be replaced by a sorting-network.
Implementations provide different trade-offs between circuit size (number of wires and gates), circuit depth (the longest directed path from a primary input to a primary output), and structure. The choice of a cardinality constraint circuit can impact the performance of the underlying SAT solver. The scope of this disclosure is not limited by the type of constraint circuit being implemented.
In addition to being able to generate a test vector for multiple single-faults in one iteration (i.e., running the SAT solver once), it is also possible to generate an entire test suite that can test all possible single-faults in a circuit by running the SAT solver once. To do so, the miter structure shown in
In addition to the “one” constraint applied to each fault-augmented circuit block, another constraint can be added to ensure that there is a test vector for each fault variable or for a subset of the fault variables. Such a constraint is applied by a number of OR gates coupled to the corresponding assumable inputs of each fault-augmented circuit block, regardless of to which row it belongs. In other words, all j-th assumable inputs of all fault-augmented circuit blocks are coupled to the same j-th OR gate. Because there are n×k fault-augmented circuit blocks, each OR gate has n×k inputs. For example, the first assumable inputs of all fault-augmented circuit blocks, including all ƒi,1l(1≤i≤k, 1≤l≤n), are coupled to first OR gate 1116, with the output of OR gate 1116 being fixed as 1, meaning that at least one of the ƒi,1l(1≤i≤k, 1≤l≤n) is 1. Similarly, the last assumable inputs of all fault-augmented circuit blocks, including all ƒi,nl(1≤i≤k, 1≤l≤n), are coupled to last OR gate 1118. The idea for implementing these OR gates is that each fault variable ƒi,jl(1≤i≤k, 1≤j≤n, 1≤l≤n) must be tested by a fault-augmented circuit block, and it does not matter by which exactly.
Given the multiple rows of miter structures and the constraints, a SAT solver can find a satisfying solution for the Boolean formula representing the multiple rows of miter structures. The solution includes assignments to the primary inputs of the original circuit at each row (e.g., X1, X2, . . . , or Xn), which corresponds to a test vector, and the test vectors obtained from the different rows form a complete test suite.
In the examples shown in
The system can then design various fault-augmented circuit blocks (which are the basic building blocks of the test-generating circuit design) (operation 1204). In some embodiments, designing a fault-augmented circuit block comprises inserting an augmentation subcircuit (e.g., a stuck-at-fault-augmentation subcircuit) at the output of each gate in the original circuit and at each primary input of the original circuit (e.g., as shown in
The system can then convert the circuit design to a Boolean formula (operation 1208) and feed the Boolean formula to a SAT solver (operation 1210). In some embodiments, the Boolean formula can be converted to a standard form such as the Conjunction Normal Form (CNF) to allow a standard SAT solver (e.g., one based on the Davis-Putnam-Logemann-Loveland (DPLL) algorithm) to find a satisfying solution to the Boolean formula, given the constraint. The system determines whether the SAT solver can find a satisfying solution for the Boolean formula given the constraint (operation 1212). If the SAT solver finds a satisfying solution, the system can then add an additional branch (i.e., another fault-augmented circuit block coupled to the original circuit) to the miter structure design (operation 1214) and convert this extended circuit design to a Boolean formula (operation 1208). If the SAT solver returns UNSAT, meaning that the number of fault-augmented circuit blocks in the single-fault miter circuit design has reached its maximum value, adding additional branches in the same row can no longer increase the cardinality of the test vector.
In response to the SAT solver outputting UNSAT for the miter circuit design, the system can relax the constraint by adding an additional row of miter structure (operation 1216). The system also modifies the design of the constraint circuit (e.g., replacing the “exactly k” constraint with OR gates). The expanded circuit design, including the modified constraint circuit design, can be similar to the designs of circuits shown in
The test suite can then be used by a testing system to test the physical circuits fabricated according to the design of the original circuit. For example, the testing system can use the test vectors as inputs to test the physical circuit. By comparing the outputs of the physical circuit responsive to a test vector to the predetermined outputs (i.e., outputs of the original, no-fault circuit responsive to the test vector), the system can determine whether the physical circuit contains a fault. Moreover, the particular test vector used as the circuit input can indicate the location and/or type of the fault. Because a single test vector may be used to test multiple single-faults, after identifying the test vector leading to the fault, additional testing may be needed to pinpoint the fault location. As discussed previously, the test suite generated using the process shown in
Fault library 1302 stores the fault-augmented subcircuits for various types of fault, including but not limited to: the stuck-at fault, the wrong-component-type fault, the bridging fault, and the open-wire fault. Circuit-receiving module 1304 receives the original, no fault circuit design. In some embodiments, circuit-receiving module 1304 can receive the design (e.g., the layout) of the circuit, and the to-be-tested physical circuits are manufactured according to the design. In alternative embodiments, the received circuit design can be in the form of a netlist that includes a list of components in the circuit and a list of the nodes to which they are connected. In addition to a digital circuit, circuit-receiving module 1304 can receive the design of a physical system or a computational system of a different type, such as a mechanical system, an analog circuit, an electro-optical system, an electro-mechanical system, a processor, a reversible computing circuit, a quantum circuit, an optical circuit, a quantum optical circuit, a computer program, etc. Depending on the types of physical system, the received design can have different formats. For example, for a mechanical or an optical system, the design can be a model (e.g., a mathematical model) of the system; and for a computer program, the design can be logic expressions. In addition, depending on the type of physical system being tested, fault library 1302 can include different types of faults.
Fault-augmented-circuit-block-generation module 1306 can generate designs of fault-augmented circuit blocks, which are the basic building blocks of a composite circuit that can be used to generate test vectors. In some embodiments, to ensure that each and every component in the circuit design can be tested for a particular type of fault (e.g., the stuck-at fault), fault-augmented-circuit-block-generation module 1306 can attach the fault-augmented subcircuit to each and every component and to each and every primary input. More specifically, to emulate the wrong-component-type faults, fault-augmented-circuit-block-generation module 1306 can replace each component in the circuit design with a universal component cell similar to the one shown in
Miter-circuit-construction module 1308 can generate a miter circuit design based on the original circuit design and designs of the fault-augmented circuit blocks. More specifically, miter-circuit-construction module 1308 can design a miter by pairing the original circuit with a fault-augmented circuit block and form a miter structure by coupling the one or more miters. Depending on its application (i.e., whether it is used to generate a test vector that tests one single-fault or a test vector that tests multiple single-faults), a miter structure design can include one or more fault-augmented circuit blocks (e.g., similar to the ones shown in
Constraint-application module 1310 can apply the appropriate constraints (e.g., the “one” constraint or the “exactly k” constraint) to the miter circuit design(s) constructed by the miter-circuit-constructing module 1308. Circuit-format-conversion module 1312 can convert the miter circuit design(s) along with the constraints to a Boolean formula. In some embodiments, the Boolean formula can be in the CNF form. SAT solver 1314 solves the Boolean formula by finding a satisfying solution. If no satisfying solution is found, SAT solver 1314 returns UNSAT. In some embodiments, SAT solver 1314 can work in tandem with miter-circuit-construction module 1308 to construct a miter circuit design that can be used to generate an optimum test suite for a particular circuit. More specifically, when such a constructed miter circuit design is fed to the SAT solver, the SAT solver can find a satisfying solution, which includes all the test vectors in the test suite. More particularly, the optimum test suite can include a minimum number of test vectors that can be used to test each and every component in the particular circuit.
Test-vector-output module 1316 can output the test vectors or test suite. In some embodiments, the test vectors or test suite can be sent to testing equipment, which can then use the test vectors as inputs to test physical circuits fabricated according to the design. By using the test vectors as inputs to a physical circuit and observing its outputs, the testing equipment can determine whether the physical circuit contains fault.
Compared with other schemes for generating test vectors, the disclosed solution provides a number of advantages. First, compared with traditional approaches that only generate test vectors for stuck-at faults, the disclosed approach can generate test vectors for arbitrary faults. More specifically, the system can include a fault library that includes designs of various fault-augmentation subcircuits for emulating the various types of fault.
Second, by constructing a circuit design comprising multiple rows of miter structures, the system can use a single unchanged encoding to find all test vectors for testing a circuit by running the SAT solver just once. In addition to testing physical circuits according to the design, the proposed solution can also be easily expanded to detect and correct design errors.
In the examples used in the disclosure, the circuits or systems under testing are digital circuits. In practice, it is not necessary for the system model to be Boolean, the disclosed testing method and testing system can be applied to any system with inputs and outputs that can be described in propositional logic. For example, in addition to digital circuits, this technique can also be used to generate test vectors for testing other types of computational systems, such as reversible computing circuits, quantum circuits, optical circuits comprising optical gates, quantum optical circuits, processors, computer programs, etc.
Test-vector-generating system 1420 can include instructions, which when executed by computer system 1400, can cause computer system 1400 or processor 1402 to perform methods and/or processes described in this disclosure. Specifically, test-vector-generating system 1420 can include instructions for receiving an original, no-fault circuit design (circuit-receiving module 1422), instructions for generating designs of fault-augmented circuit blocks (fault-augmented-circuit-block-generation module 1424), instructions for constructing miter circuit design(s) (miter-circuit-construction module 1426), instructions for applying constraints (constraint-application module 1428), instructions for converting the circuit design(s) to a Boolean formula (circuit-format-conversion module 1430), instructions for implementing a SAT solver (SAT solver 1432), and instructions for outputting the test vectors (test-vector-output module 1434). Data 1440 can include a component library 1442 and a fault library 1444.
The methods and processes described in the detailed description section can be embodied as code and/or data, which can be stored in a computer-readable storage medium as described above. When a computer system reads and executes the code and/or data stored on the computer-readable storage medium, the computer system performs the methods and processes embodied as data structures and code and stored within the computer-readable storage medium.
Furthermore, the methods and processes described above can be included in hardware modules or apparatus. The hardware modules or apparatus can include, but are not limited to, application-specific integrated circuit (ASIC) chips, field-programmable gate arrays (FPGAs), dedicated or shared processors that execute a particular software module or a piece of code at a particular time, and other programmable-logic devices now known or later developed. When the hardware modules or apparatus are activated, they perform the methods and processes included within them.
The foregoing descriptions of embodiments of the present invention have been presented for purposes of illustration and description only. They are not intended to be exhaustive or to limit the present invention to the forms disclosed. Accordingly, many modifications and variations will be apparent to practitioners skilled in the art. Additionally, the above disclosure is not intended to limit the present invention. The scope of the present invention is defined by the appended claims.