US20040225459A1 - Method and structure to develop a test program for semiconductor integrated circuits - Google Patents

Method and structure to develop a test program for semiconductor integrated circuits Download PDF

Info

Publication number
US20040225459A1
US20040225459A1 US10/772,434 US77243404A US2004225459A1 US 20040225459 A1 US20040225459 A1 US 20040225459A1 US 77243404 A US77243404 A US 77243404A US 2004225459 A1 US2004225459 A1 US 2004225459A1
Authority
US
United States
Prior art keywords
test
module
resource
file
name
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Abandoned
Application number
US10/772,434
Inventor
Ramachandran Krishnaswamy
Harsanjeet Singh
Ankan Pramanick
Mark Elston
Leon Chen
Toshiaki Adachi
Yoshihumi Tahara
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Advantest Corp
Original Assignee
Advantest Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Advantest Corp filed Critical Advantest Corp
Priority to US10/772,434 priority Critical patent/US20040225459A1/en
Priority to TW093103547A priority patent/TWI344595B/en
Assigned to ADVANTEST CORPORATION reassignment ADVANTEST CORPORATION ASSIGNMENT OF ASSIGNORS INTEREST (SEE DOCUMENT FOR DETAILS). Assignors: ELSTON, MARK, PRAMANICK, ANKAN, ADACHI, TOSHIAKI, KRISHNASWAMY, RAMACHANDRAN, SINGH, HARSANJEET, TAHARA, YOSHIHUMI, CHEN, LEON
Priority to US10/917,916 priority patent/US7184917B2/en
Priority to US10/918,714 priority patent/US7197417B2/en
Priority to US10/918,513 priority patent/US7209851B2/en
Publication of US20040225459A1 publication Critical patent/US20040225459A1/en
Priority to US12/748,317 priority patent/US8255198B2/en
Abandoned legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • G01R31/318307Generation of test inputs, e.g. test vectors, patterns or sequences computer-aided, e.g. automatic test program generator [ATPG], program translations, test program debugging
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • G01R31/318342Generation of test inputs, e.g. test vectors, patterns or sequences by preliminary fault modelling, e.g. analysis, simulation
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/319Tester hardware, i.e. output processing circuits
    • G01R31/31903Tester hardware, i.e. output processing circuits tester configuration
    • G01R31/31907Modular tester, e.g. controlling and coordinating instruments in a bus based architecture

Definitions

  • the present invention relates to the testing of integrated circuits (ICs), and more particularly to developing a test program for automated semiconductor test equipment (ATE).
  • ICs integrated circuits
  • ATE automated semiconductor test equipment
  • Tests Today tester manufacturers use their own proprietary languages to develop test programs for semiconductor test systems (testers). For example, machines produced by Advantest Corporation utilize the Test Description Language (TDL), and Credence Systems offers its own Waveform Generation Language (WGL). To overcome this degree of specialization, IC and tester manufacturers tried to find a common ground by developing IEEE standard 1450, the Standard Test Interface Language (STIL). STIL, however, is a highly specialized language for defining pins, test commands, timing, etc. Moreover, a test engineer running STIL nevertheless still needs to translate STIL into the proprietary manufacturer-specific language required by the tester. Thus STIL merely serves as an intermediate language that is nonetheless highly specialized and not generally known to programmers.
  • TDL Test Description Language
  • WGL Waveform Generation Language
  • TDL Test Description Language
  • WGL Waveform Generation Language
  • STIL Standard Test Interface Language
  • STIL is a highly specialized language for defining pins, test commands, timing, etc.
  • a test engineer running STIL nevertheless still needs to translate STIL into the proprietary manufacturer-specific
  • test program can be written in a general purpose language.
  • this method should allow for easy development of test programs for an open architecture test system.
  • This application describes test program development using object-oriented constructs, e.g., C++ objects and classes.
  • this method is suitable for developing test programs for an open architecture tester, such as that described in U.S. application Ser. Nos. 60/449,622, 10/404,002 and 10/403,817, assigned to the assignee of the present invention.
  • Describing test system resources may comprise specifying a resource type, where the resource type is associated with at least one test module for applying a test to the IC, specifying a parameter type associated with the resource type, and specifying a parameter of the parameter type.
  • Describing test system configuration may comprise specifying a site controller for controlling at least one test module, where each test module applies a test to the IC, and specifying an input port of a module connection enabler.
  • the test system couples the site controller to the module connection enabler at the specified input port, and the module connection enabler couples the site controller to a test module.
  • the module connection enabler may be implemented as a switch matrix.
  • Describing module configuration may comprise specifying a module identifier for specifying a module type, specifying executable code for controlling a test module of the module type specified by the module identifer, and specifying a resource type associated with the test module.
  • the executable code may take the form of a dynamic link library.
  • Describing module configuration may further involve the user specifying a slot identifier for specifying an output port of the module connection enabler, where the test system couples the test module to the module connection enabler at the output port, and the module connection enabler couples the test module to a corresponding site controller.
  • the user may also specify a vendor identifier for identifying the provider of the test module, and an identifier of the maximum number of resource units available in connection with the resource type.
  • the resource type may be, for example, digital tester pins and the resource units tester channels. Alternatively, the tester channel resource units may also correspond to resource types such as, for example, analog tester pins, RF tester pins, power supply pins, digitizer pins, and arbitrary waveform generation pins.
  • An indicator relating to which resource units are disabled may also be provided. The resource units indicated as disabled may represent defective resource units of the test module.
  • Describing a test sequence may comprise specifying the order (or flow) in which various tests can be applied.
  • Describing test patterns may comprise specifying the test patterns, associated voltage and current levels, transitions in signal values, corresponding rise and fall times and associated timing.
  • a pattern compiler of an embodiment of the invention includes at least one module-specific pattern compiler, and an object file manager for directing each module-specific compiler to compile both a corresponding module-specific section of a pattern source file and a common section of the pattern source file.
  • the common section includes information accessible to all of the module-specific compilers.
  • An output of the compiler includes at least one module-specific pattern data section. Module-specific pattern loaders load into corresponding test modules module-specific pattern data from corresponding module-specific pattern data sections for execution.
  • FIG. 5 illustrates how different test instances may be derived from a single test class according to an embodiment of the present invention.
  • FIG. 7 illustrates a ordered pattern tree example according to an embodiment of the present invention.
  • FIG. 8 illustrates another ordered pattern tree example according to an embodiment of the present invention.
  • FIG. 10 illustrates waveform generation according to an embodiment of the present invention.
  • FIG. 11 illustrates a mapping used for timing according to an embodiment of the present invention.
  • FIG. 12 illustrates another mapping used for timing according to an embodiment of the present invention.
  • FIG. 1 illustrates a generalized architecture of a conventional tester showing how a signal is generated and applied to a device-under-test (DUT).
  • DUT device-under-test
  • Each DUT input pin is connected to a driver 2 that applies test data, while each DUT output pin is connected to a comparator 4 .
  • tri-state driver-comparators are used so that each tester pin (channel) can act either as an input pin or as an output pin.
  • the tester pins dedicated to a single DUT collectively form a test site that works with an associated timing generator 6 , waveform generator 8 , pattern memory 10 , timing data memory 12 , waveform memory data 14 , and block 16 that define the data rate.
  • FIG. 2 illustrates a system architecture 100 according to an embodiment of the present invention.
  • a system controller (SysC) 102 is coupled to multiple site controllers (SiteCs) 104 .
  • the system controller may also be coupled to a network to access files.
  • a module connection enabler 106 each site controller is coupled to control one or more test modules 108 located at a test site 110 .
  • the module connection enabler 106 allows reconfiguration of connected hardware modules 108 and also serves as a bus for data transfer (for loading pattern data, gathering response data, providing control, etc.). Possible hardware implementations include dedicated connections, switch connections, bus connections, ring connections, and star connections.
  • the module connection enabler 106 may be implemented by a switch matrix, for example.
  • Each test site 110 is associated with a DUT 112 , which is connected to the modules of the corresponding site through a loadboard 114 . In one embodiment, a single site controller may be connected to multiple DUT sites.
  • FIG. 3 illustrates a software architecture 200 according to an embodiment of the present invention.
  • the software architecture 200 represents a distributed operating system, having elements for the system controller 220 , at least one site controller 240 , and at least one module 260 in correspondence to related hardware system elements 102 , 104 , 108 .
  • the architecture 200 includes a corresponding element for module emulation 280 in software.
  • the development environment for this platform can be based on Microsoft Windows.
  • the use of this architecture has side benefits in program and support portability (e.g., a field service engineer could connect a laptop which runs the tester operating system to perform advanced diagnostics).
  • a field service engineer could connect a laptop which runs the tester operating system to perform advanced diagnostics.
  • the relevant software can be made as an independent entity capable of running independently to allow job scheduling across distributed platforms.
  • Related software tools for batch jobs are thus capable of running on multiple platform types.
  • ANSI/ISO standard C++ can be taken as the native language for the software.
  • ANSI/ISO standard C++ can be taken as the native language for the software.
  • options available to provide a layer over the nominal C++ interfaces that allows a third party to integrate into the system with an alternative language of its own choice.
  • FIG. 3 illustrates a shading of elements according to their organization by nominal source (or collective development as a sub-system) including the tester operating system, user components 292 (e.g., supplied by a user for test purposes), system components 294 (e.g., supplied as software infrastructure for basic connectivity and communication), module development components 296 (e.g., supplied by a module developer), and external components 298 (e.g., supplied by external sources other than module developers).
  • nominal source or collective development as a sub-system
  • user components 292 e.g., supplied by a user for test purposes
  • system components 294 e.g., supplied as software infrastructure for basic connectivity and communication
  • module development components 296 e.g., supplied by a module developer
  • external components 298 e.g., supplied by external sources other than module developers.
  • User components 292 include: a user test plan 242 , user test classes 243 , hardware loadboard 265 , and DUT 266 , a DUT Verilog model 293 and a DUT C/C++ model 291 .
  • System components 294 include: system tools 226 , communications library 230 , test classes 244 , a backplane driver 250 , HW backplane 261 , simulation framework 281 , backplane emulation 282 , and loadboard simulation 286 .
  • Module-development components 296 include: module commands implementation 248 , module hardware 263 , and module emulation 284 .
  • External components 298 include external tools 225 .
  • the system controller 220 includes interfaces 222 to site controller, framework classes 224 , system tools 226 , external tools 225 , and a communications library 230 .
  • the System Controller software is the primary point of interaction for the user. It provides the gateway to the Site Controllers of the invention, and synchronization of the Site Controllers in a multi-site/DUT environment as described in U.S. application No. 60/449,622 by the same assignee. User applications and tools, graphical user interface (GUI)-based or otherwise, run on the System Controller.
  • GUI graphical user interface
  • the System Controller also may act as the repository for all Test Plan related information, including Test Plans, test patterns and test parameter files. The memory storing these files may be local to the system controller or offline, e.g., connected to the system controller through a network.
  • a test parameter file contains parameterization data for a Test class in the object oriented environment of an embodiment of the invention.
  • Third party developers can provide tools in addition to (or as replacements for) the standard system tools 226 .
  • the standard interfaces 222 on the System Controller 220 include interfaces that the tools use to access the tester and test objects.
  • the Tools (applications) 225 , 226 allow interactive and batch control of the test and tester objects.
  • the tools include applications for providing automation capabilities (through, for example, the use of SECS/TSEM, etc.)
  • the Communications library 230 residing on the system controller 220 provides the mechanism to communicate with the Site Controllers 240 in a manner that is transparent to user applications and test programs.
  • the site controller 240 hosts a user test plan 242 , user test classes 243 , standard test classes 244 , standard interfaces 245 , site controller framework classes 246 , module high level command interfaces (i.e., predetermined module-level interfaces 247 , module commands implementation 248 , backplane communications library 249 , and a backplane driver 250 .
  • module high level command interfaces i.e., predetermined module-level interfaces 247 , module commands implementation 248 , backplane communications library 249 , and a backplane driver 250 .
  • most of the testing functionality is handled by the site controllers 104 / 240 , thus allowing independent operation of the test sites 110 .
  • a Test Plan 242 is written by the user.
  • the plan may be written directly in a standard computer language employing object-oriented constructs, such as C++, or described in a higher level test programming language to produce C++ code, which can then be compiled into the executable test program.
  • object-oriented constructs such as C++
  • C++ code For test program development, one embodiment of the invention employs assignee's inventive Test Program Language (TPL) compiler.
  • TPL Test Program Language
  • the test program compiler 400 acts in part as a code generator including a translator section 402 to translate a test program developer's source files 404 describing tests and associated parameters into object-oriented constructs, such as C++ code.
  • the test plan creates test objects by using the Framework Classes 246 and/or standard or user supplied Test Classes 244 associated with the site controllers, configures the hardware using the Standard Interfaces 245 , and defines the test plan flow. It also provides any additional logic required during execution of the test plan.
  • the test plan supports some basic services and provides an interface to the services of underlying objects, such as debug services (e.g., break-pointing), and access to underlying framework and standard classes.
  • the Framework classes 246 associated with the site controllers are a set of classes and methods that implement common test-related operations.
  • the site controller-level framework includes, for example, classes for power supply and pin electronics sequencing, setting level and timing conditions, obtaining measurements, and controlling test flow.
  • the framework also provides methods for runtime services and debugging.
  • the framework objects may work through implementing the standard interfaces. For example, the implementation of the TesterPin framework class is standardized to implement a general tester pin interface that test classes may use to interact with hardware module pins.
  • Certain framework objects may be implemented to work with the help of the module-level interfaces 247 to communicate with the modules.
  • the site controller framework classes effectively act as a local operating system supporting each site controller.
  • the program code In general more than ninety percent of the program code is data for the device test, and the remaining ten percent of the code realizes the test methodology.
  • the device test data is DUT-dependent (e.g., power supply conditions, signal voltage conditions, timing conditions, etc.).
  • the test code consists of methods to load the specified device conditions on to ATE hardware, and also those needed to realize user-specified objectives (such as datalogging).
  • the framework of an embodiment of the invention provide a hardware-independent test and tester object model that allows the user to perform the task of DUT test programming.
  • test code may be made independent of any device-specific data (e.g., pin name, stimulus data, etc.), or device-test-specific data (e.g., conditions for DC units, measurement pins, number of target pins, name of pattern file, addresses of pattern programs). If code for a test is compiled with data of these types, the reusability of the test code would decrease. Therefore, according to an embodiment of the invention, any device-specific data or device-test-specific data may be made available to the test code externally, as inputs during code execution time.
  • device-specific data e.g., pin name, stimulus data, etc.
  • device-test-specific data e.g., conditions for DC units, measurement pins, number of target pins, name of pattern file, addresses of pattern programs.
  • ACPararnetricTests ACParametricTests.
  • test types may provide default implementations of some virtual methods (e.g., init( ), preExec( ), and postexec( )). These methods become the test engineer's entry points for overriding default behavior and setting any test-specific parameters.
  • custom test classes can also be used in test plans.
  • Test classes allow the user to configure class behavior by providing parameters that are used to specify the options for a particular instance of that test.
  • a Functional Test may take parameters PList and TestConditionS, to specify the Pattern List to execute, and the Level and Timing conditions for the test, respectively.
  • PList and TestConditionS parameters that are used to specify the Pattern List to execute
  • Level and Timing conditions for the test, respectively.
  • Specifying different values for these parameters allows the user to create different instances of a Functional Test.
  • FIG. 5 illustrates how different test instances may be derived from a single test class.
  • a Template Library may be employed as the general-purpose library of generic algorithms and data structures. This library may be visible to a user of the tester, so that the user may, for example, modify the implementation of a test class to create a user-defined test class.
  • an embodiment of the system supports integration of such test classes into the framework in that all test classes derive from a single test interface, e.g., ITest, so that the framework can manipulate them in the same way as the standard set of system test classes. Users are free to incorporate additional functionality into their test classes, with the understanding that they have to use custom code in their test programs to take advantage of these additional facilities.
  • Each test site 110 is dedicated to testing one or more DUTs 106 , and functions through a configurable collection of test modules 112 .
  • Each test module 112 is an entity that performs a particular test task.
  • a test module 112 could be a DUT power supply, a pin card, an analog card, etc. This modular approach provides a high degree of flexibility and configurability.
  • the Module Commands Implementation classes 248 may be provided by module hardware vendors, and implement either the module-level interfaces for hardware modules, or provide module-specific implementations of standard interfaces, depending on the commands implementation method chosen by a vendor.
  • the external interfaces of these classes are defined by pre-determined module level interface requirements, and backplane communications library requirements. This layer also provides for extension of the standard set of test commands, allowing the addition of methods (functions) and data elements.
  • the Backplane Communications Library 249 provides the interface for standard communications across the backplane, thereby providing the functions necessary to communicate with the modules connected to the test site. This allows vendor-specific module software to use a Backplane Driver 250 to communicate with the corresponding hardware modules.
  • the backplane communications protocol may use a packet based format.
  • Tester Pin objects represent physical tester channels and derive from a tester pin interface, denoted here as ITesterPin.
  • the software development kit (SDK) of an embodiment of the invention provides a default implementation of ITesterPin, which may be called TesterPin, which is implemented in terms of a predetermined module-level interface, IChannel. Vendors are free to make use of TesterPin if they can implement their module's functionality in terms of IChannel; otherwise, they must provide an implementation of ITesterPin to work with their module.
  • the standard module interface denoted here as IModule, provided by the tester system of the invention generically represents a vendor's hardware module.
  • Vendor-supplied module-specific software for the system may be provided in the form of executables such as dynamic link libraries (DLLs).
  • DLLs dynamic link libraries
  • Software for each module-type from a vendor may be encapsulated in a single DLL.
  • Each such software module is responsible for providing vendor-specific implementations for the module interface commands, which comprise the API for module software development.
  • module interface commands serve as the interface for users to communicate (indirectly) with a particular hardware module in the system, and second, they provide the interfaces that third-party developers can take advantage of to integrate their own modules into the site controller level framework.
  • module interface commands provided by the framework are divided into two types:
  • tester pin interface provides methods to get and set level and timing values
  • IPowerSupply provides methods for powering up and powering down, for example.
  • the framework provides the special category of the predetermined module-level interfaces, which can be used to communicate with the modules. These are the interfaces used by framework classes (i.e., “standard” implementations of framework interfaces) to communicate with vendor modules.
  • the use of the second aspect, the module-level interfaces is optional.
  • vendors may then take advantage of the implementations of classes such as ITesterPin and IPowerSupply, etc. while focusing on the content of specific messages sent to their hardware by implementing the module-level interfaces. If these interfaces are inappropriate to the vendor, however, they may choose to provide their custom implementations of the framework interfaces (e.g., vendor implementations of ITesterPin, IPowerSupply, etc.). These would then provide the custom functionality that is appropriate for their hardware.
  • Section A describes rules to describe the test environment in which test program will be used; section B describes the method and rules for test program development; section C specifies the method and rules to develop a test plan and how to define the main structure of the test program; section D describes how to run a test program on an open architecture test system; section E describes a method and rules for test patterns; section F describes rules to describe the timing of the test patterns; and section G describes rules for the overall tester operation.
  • the test environment comprises a set of files that specify the necessary conditions for bringing up the tester, and for preparing it to run a set of tests.
  • the test environment preferably includes files for:
  • Tester Resource definition for the specification of the types of tester resources—and supported parameters for such resources—that are available in the open architecture test system.
  • Tester configuration for the specification of Site Controllers, sites and corresponding mappings.
  • Pin options for the specification of special options, or modes, for pins.
  • Pattern lists for the specification of test patterns and their sequence.
  • items 1-3 are created by ICF (installation and configuration files) with information from a CMD (configuration management database), and made available at a well-known location, while items 4-8 are user-specified.
  • ICF installation and configuration files
  • CMD configuration management database
  • items 4-8 are user-specified.
  • This section provides descriptions for the items 1-6 above; items 7-8 are described in more detail in section E. Specific methods and rules are preferably used to develop each of these components; these methods and rules will be described in this section with examples.
  • Each hardware module provides one or more types of hardware resources (resources for short) for use by the test system.
  • the tester Resource Definition is preferably used to declare a set of resource names for the available resource types, and a set of parameter names and types associated with each particular resource type.
  • the resource name dpin is used to refer to digital tester pins.
  • These resources have parameters such as VIL (for the input low voltage), VIH (for the input high voltage), VOL (for the output low voltage), VOH (for the output high voltage), etc.
  • a resource definition file will have the extension “.rsc”.
  • a resource parameter such as Voltage or Time
  • Vendors supplying special purpose resources that prefer the specification of different parameters should provide their own resource definition files.
  • resource-file version-info
  • resource-defs version-info Version version-identifer
  • resource-defs ResourceDefs ⁇ resource-def-list ⁇
  • resource-def-list resource-def resource-def-list resource-def resource-def: resource-name ⁇ resource-params-decl-list ⁇
  • resource-params-decl-list resource-params-decl resource-params-decl-list resource-params-decl-list resource-params-decl resource-params-decl: elementary-type-name resource-param-name-list
  • resource-param-name-list resource-param-name resource-param-name-list , resource-param-name
  • version-identifier A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number.
  • resource-name A sequence of one or more characters from the set [a-zA-Z — 0-9], not starting with a digit. It represents the name of a resource, such as dpin or dps.
  • elementary-type-name A sequence of one or more characters from the set [a-zA-Z — 0-9], not starting with a digit. It represents the name of an elementary type, such as Voltage (cf.).
  • resource-param-name A sequence of one or more characters from the set [a-zA-Z — 0-9], not starting with a digit. It represents the name of a resource parameter, such as VIL.
  • the Tester Configuration is a set of rules that is preferably used to list the Site Controllers in a particular system configuration, and the connection of the Site Controllers to the Switch Matrix input ports.
  • a single Site Controller can be connected to a single switch matrix input port.
  • the switch matrix connections serve as implicit identifiers for the Site Controllers in the system (other configurations are possible).
  • the first field is the hostname of the Site Controller machine; # it can be specified as either a dotted-decimal IP address or a # domain-qualified hostname.
  • # # # # The second field is the switch matrix input port number, which # implicitly serves as the identifier for the Site Controller # connected to it.
  • the system configuration for a particular test-floor system is part of the system profile, and is made available as the system configuration file Sys.cfg.
  • the Site Controller connected to port 1 (“127.0.0.0” in the above example) may enjoy special status, in which it alone configures the Switch Matrix.
  • This “special” Site Controller will be referred to as SITEC-1.
  • the site controller address in this example is an IP address because the site controllers may be connected to the system controller by an internal network. Conversely, the system controller may be connected to an external network to access files, such as pattern data.
  • system-config-file version-info
  • system-config version-info Version version-identifer
  • system-config SysConfig ⁇ site-controller-connection-list
  • site-controller-connection-list site-controller-connection site-controller-connection-list
  • site-controller-connection site-controller-connection site-controller-hostname input-port
  • site-controller-hostname ip-address domain-qualified-hostname ip-address: octet . octet . octet . octet domain-qualified-hostname: name domain-qualified-hostname . name
  • version-identifier A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number.
  • octet A nonnegative integer from 0 to 255 (in decimal notation).
  • name A sequence of one or more characters from the set [a-zA-Z — 0-9], not starting with a digit. It represents a name segment in a domain-qualified hostname.
  • the Module Configuration allows the specification of the physical configuration of the tester, e.g., the physical location and type of each module in a SYSTEM chassis. This is necessitated by the dynamic nature of the tester bus configuration, which allows a mapping of the tester bus address to the physical slot location. This information allows a hardware discovery process that occurs at system boot-up time to validate the SYSTEM configuration.
  • Each output port of the Switch Matrix defines a physical slot, which is preferably occupied by a single hardware module.
  • Module Configuration File Modules.cfg # Version 0.0.1
  • ModuleConfig ⁇ # # # A configuration definition which provides information about # the module type that is attached to slots 1-12 and 32-48. # Note that a module might provide more than # a single type of resource.
  • # Slot 1-12, 32-48 # Switch matrix output ports # which use the configuration # defined below. ⁇ VendorID 1; # defined vendor code. ModuleID 1; # Vendor-defined id code. ModuleDriver mod1.dll; # Module software.
  • # # # Resource named dpin specifies channels # for digital data. The name dpin is not # a keyword.
  • # Resource dpin ⁇ MaxAvailable32; # Resource units 1 .. 32. ⁇ Resource analog ⁇ MaxAvailable16; # Resource units 1 .. 16. Disabled 1-8; # Disabled resources 1 .. 8. # So, enabled ones are 9 .. 16. ⁇ ⁇ # # A configuration definition which provides information about # the module type that is attached to slots 16-30, 50, and 61-64. # Slot 16-30, 50, 61-64 ⁇ Resource dpin ⁇ MaxAvailable32; # Max available resource units. Disabled 3, 30-32; # Disabled resources.
  • a slot refers to connector through which a hardware module can be connected, such as an output port of the switch matrix.
  • Each configuration definition provides information about the module that may be attached to one or more slots.
  • the VendorID specified in a configuration definition is a unique ID associated with a vendor.
  • the ModuleID refers to a type of module provided by this vendor. There may be several instances of the same ModuleID in a tester configuration.
  • the ModuleDriver refers to a vendor supplied DLL to service the module.
  • the Resource refers to the units serviced by this module, and provides a name for the resource type; the resource name is obtained from the resource definition file.
  • the above example describes three configuration blocks in a module configuration file.
  • the first configuration block, slots 1-12 and 32-48 are serviced by a module produced by vendor 1 .
  • This vendor provides the module, the identifier “1” to refer to this module type, and the module driver library to control the module.
  • This module can provide two types of resource units, one designated by the resource name “dpin”, with preferably a total number of 32 resource units (i.e., “channels”), all of which are available, and the other designated by the resource name “analog”, with a total number of 16 resource units, of which only 9 through 16 are available.
  • the second and third configuration blocks are specified in a manner similar to the first configuration.
  • a configuration block may have one or more slot identifiers. When a block has more than a single slot identifier, then the identified slots are said to be cloned.
  • the module configuration file, Modules.cfg is created as part of the system profile by the ICM (installation configuration management system) (with test-floor-specific information provided by the user), and made available at a well-known location.
  • the ICM is a utility that can be local to the test system, e.g., on the system controller, or reside elsewhere on the network to which the system controller is connected.
  • the ICM manages the CMD (configuration management database), and typically updated on hardware changes to the system configuration. ICM allows the user to configure the system, e.g., site controllers and modules.
  • the CMD is a database that stores the configurations. For actual tester configuration/operation ICM generates the configuration files, e.g., module configuration, and other files, and copies them and associated files, such as particular module DLLs, onto the tester.
  • module configuration structure in accordance with the preferred embodiment: file-contents: version-info module-config-def version-info: Version version-identifier ; module-config-def: ModuleConfig ⁇ slot-entry-list ⁇ slot-entry-list: slot-entry slot-entry-list slot-entry slot-entry: Slot positive-integer-list ⁇ slot-info ⁇ slot-info: required-config-list required-config-list: required-config required-config-list required-config required-config: VendorID id-code ; ModuleID id-code ; ModuleDriver file-name ; Resource resource-name ⁇ max-spec disabled-spec opt ⁇ max-spec: MaxAvailable positive-integer ; disabled-spec: Disabled positive-integer-list ; positive-integer-list: positive-integer-entry positive-integer-list, positive-integer-list-entry positive-integer-list-entry: positive-integer positive-integer positive-integer positive-inte
  • version-identifier A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must be from the set [0-9].
  • id-code A sequence of one or more characters from the set [a-zA-Z — 0-9].
  • resource-name A sequence of one or more characters from the set [a-zA-Z — 0-9], where the first character must be from the set [a-zA-Z].
  • the DUT pin descriptions are described using a Pin Descriptions file.
  • the user makes available a description of the DUT pins in a pin description file, which has the extension pin.
  • This plain text file contains, at least the following: a listing of the DUT pin names; and initial definitions of named pin groups, which make use of the defined DUT pin names (“initial” since they can be subsequently modified or added to, etc., programmatically).
  • resource type blocks to allow the compiler to correlate pin and pin group definitions with the allowable parameter settings for Levels, etc.
  • Pin groups and pins share the same namespace and have global (i.e., Test Plan) scope.
  • Test Plan i.e., Test Plan
  • One of the consequences of the global scoping of these names is that pins and pin groups cannot use duplicated names, even when declared in different resource blocks.
  • At least one Resource definition is required in the pin description file.
  • At least one pin name should be defined in each resource.
  • the same pin or group name can be defined for two or more resources. However, duplicates within the same resource are ignored.
  • Group definitions if given, should have at least one pin name or group name (i.e., a group definition cannot be empty).
  • a pin group definition can include a reference to a previously-defined pin group.
  • a pin group definition can include set operations such as addition and subtraction of previously defined pins and/or pin groups.
  • pin-description-file version-info pin-description version-info: Version version-identifer
  • pin-description PinDescription ⁇ resource-pins-def-list ⁇ resource-pins-def-list: resource-pins-def resource-pins-def-list resource-pins-def resource-pins-def: Resource resource-name ⁇ pin-or-pin-group-def-list ⁇ pin-or-pin-group-def-list: pin-or-pin-group-def pin-or-pin-group-def-list pin-or-pin-group-def pin-or-pin-group-def-list pin-or-pin-group-def pindef-or-pin-groupdef: pin-def ; pin-group-def pin-def: pin-name pin-name [ index : index ] pin-group-def: Group pin-group-name ⁇ pin-group-def-item-list ⁇ pin-group-def-
  • version-identifier A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number.
  • resource-name A sequence of one or more characters from the set [a-zA-Z — 0-9] not starting with a digit. It represents the name of a resource, such as dpin or dps.
  • pin-name A sequence of one or more characters from the set [a-zA-Z — 0-9] not starting with a digit. It represents the name of a pin A0.
  • pin-group-name A sequence of one or more characters from the set [a-zA-Z — 0-9] not starting with a digit. It represents the name of a pin group ABUS.
  • index A nonnegative integer. It represents the lower bound or an upper bound on a group of related pins.
  • the Socket specifies the mapping between DUT pin names and physical tester pin (channel) assignments (the physical tester channel numbers are defined in the module configuration file). Note that different Sockets can be used to support different DUT packages and different load board configurations, etc. For a multi-DUT system, the Socket definitions for DUT/channel assignments can support “cloning” of a basic Socket to multiple sites. However, different Sockets (i.e., different physical mappings for the same logical pins) should respect site module partitions. Thus, in addition to providing DUT pin to tester channel assignments, the socket also effectively defines the site partitioning. A Socket file could thus contain definitions for several individual site sockets.
  • the Socket file uses information from both module configuration file, and the user's pin description files for the given DUT types (see specification for PinDescription in the example above).
  • the module configuration information is made implicitly available to the Socket file compiler.
  • the socket file compiler is a subpart of the pattern compiler that reads and analyzes the socket DUT name to tester channel mapping, and the module configuration and pin description files to set up the mapping of tester pins to DUT pins used by the pattern compiler.
  • At least one DUT site definition per DUT type is required, and it must use the full-specification syntax, as opposed to the SlotOffset syntax. If more than one DUT site definition is provided for the same DUT type, the first one must use the full-specification syntax.
  • Each subsequent DUT site definition (for the same DUT type) may use either the full-specification syntax or the SlotOffset syntax, but not both. This allows individual sites to deviate from a standard pattern (due to, for example, inoperative channels).
  • DUT sites do not need to be declared in the actual physical order. This allows a case where the first (physical) site deviates from the pattern.
  • the DUT site IDs are required to be unique across the entire Socket (i.e., across all DUT types defined therein).
  • At least one resource definition is required per DUT site definition.
  • the site definitions must be used in conjunction with the module configuration to determine if the test configuration is single-site/single-DUT or single-site/multi-DUT.
  • the Socket file should specify a set of DUT channel mappings which are consistent with the pin description file and the module configuration file.
  • socket-file version-info socket-def version-info: Version version-identifer ;
  • socket-def SocketDef ⁇ device-specific-socket-def-list ⁇ device-specific-socket-def-list: device-specific-socket-def device-specific-socket-def-list device-specific-socket-def device-specific-socket-def: DUTType DUT-type-name ⁇ pin-description-file dut-info-list ⁇ pin-description-file: PinDesc pin-description-file-name ; dut-info-list: dut-info dut-info-list dut-info dut-info: DUT dut-id ⁇ site-controller-input-port resource-info-list ⁇ site-controller-input-port: SiteController switch-matrix-input-port-
  • resource-unit resource-item-name [ resource-item-index ] slot-number .
  • resource-unit-index-range resource-item-index-range: resource-item-index : resource-item-index resource-unit-index-range: resource-unit-index : resource-unit-index
  • version-identifier A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number.
  • DUT-type-name A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must not be from the set [0-9]. It represents a type of DUT, such as Pentium3.
  • pin-description-file-name The simple name of a file, not including its directory name, but including all extensions.
  • the filename is of the syntax recognized by the host operating system, and allows blanks and other characters if enclosed in quotes.
  • switch-matrix-input-port-number A nonnegative integer in decimal notation to represent the port number of the input port connected to the Site Controller.
  • dut-id A nonnegative integer in decimal notation to identify an instance of a DUT.
  • resource-name A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must not be a digit. It represents the name of a resource defined in a resource file.
  • resource-item-name A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must not be a digit. It represents the name of a resource unit, such as a pin or a pin group.
  • resource-item-index A nonnegative integer in decimal notation that represents a particular member of a group of resource items. When in the context of a resource-item-index-range it represents the lower or upper bound of a contiguous sequence of resource item group.
  • resource-unit-index A nonnegative integer in decimal notation that represents a particular member of a group of resource units (channels). When in the context of a resource-unit-index-range it represents the lower or upper bound of a contiguous sequence of resource unit group.
  • a Pin Mode Option definition would support the configuration of special options or modes for a tester channel. This could, for example, be used to select and configure channel multiplexing. It is preferred that the Pin Mode Option only be used as part of a Test Plan initialization flow, since it might require significant channel configuration.
  • the Pin Option syntax supports vendor-defined options. An example is shown below: PinModeOptions ⁇ clock IN double; a0 OUT single; ... ⁇ ;
  • the resource definition file (Resources.rsc), the system configuration file (Sys.cfg) and the module configuration file (Modules.cfg) are preferably made available at a “well-known” location.
  • This “well-known” location is the directory specified by the value of the system environment variable Tester_ACTIVE_CONFIGS. For example, if the value of Tester_ACTIVE_CONFIGS is the directory F: ⁇ Tester_SYS ⁇ configs, the system will expect the following files to be present:
  • the Installation and Configuration Management system residing on the host computer will preferably set the value of Tester_ACTIVE_CONFIGS. Every time the ICM creates a new version of one of the above files, it will place the new version in the location pointed to by Tester_ACTIVE_CONFIGS. Note that in addition to the above three files, other system configuration files such as the simulation configuration file are also placed in the location pointed to by Tester_ACTIVE_CONFIGS.
  • test environment One of the two principal end-user oriented components of the tester system is the test environment.
  • the other component is the programming facility that the tester makes available for the end user (i.e., test engineer and test class developers).
  • test plan The principal component of the programming environment is the test plan.
  • the test plan uses test classes (which are different implementations of a test interface denoted Test), which realize the separation of test data and code for particular types of tests.
  • the plan may be written directly as a C++ test program, or described in a test plan description file, which is processed by a Test Program Generator (translator 402 ) to produce object-oriented code, such as C++ code.
  • the generated C++ code can then be compiled into the executable test program.
  • the data required for populating a test class instance, such as levels, timings, etc., are specified by the user in the test plan description file.
  • a test program contains a set of user written files that specify details for running a test on a device.
  • An embodiment of the invention includes sets of rules that permit a user to write these files using C++ constructs.
  • test program in accordance with the preferred embodiment of the present invention comprises a set of files as follows:
  • test plan refers to other files with data that is either directly referenced by the importer (the file that specifies the import), or is imported by some other file directly referenced by the importer.
  • the test plan file could define globals, flows, and other such objects within it, or it could import this information from other files. These rules allows any of the above components to be either in their own individual files, or directly inlined into a test plan file. Note that the test plan is similar in concept to a C-language main( ) function.
  • Test program identifiers preferably start with an upper or lower case alphabetical character, and can subsequently have any number of alphabetical, numerical, or underscore (_) characters. It has several keywords which are provided in the description given below. These keywords are visually identified in code in this document using a bold font, such as Version. Keywords are reserved, and preferably not be used as identifiers. There are several special symbols such as ⁇ , ⁇ , (, ), :, and others which are described below.
  • An import of a test description file enables the importing file to refer to names of objects made available by the imported file. This allows the importing file to reference the objects named by the imported file.
  • a socket file aaa.soc that imports a pin description file xxx.pin.
  • bbb.soc file that also imports xxx.pin.
  • neither of these imports cause the objects described by xxx.pin to come into existence. They merely reference objects that are already assumed to exist.
  • Test Plan file is fundamentally different. In an analogy to C, it would be a file with a main( ) routine in it.
  • An “Import” statement in test plan file will elaborate these objects, that is, cause these objects to come into existence.
  • the test plan mickey.tpl shown below causes the objects in xxx.pin and aaa.soc to be elaborated: # File for Mickey's TestPlan Version 3.4.5; # # These import statements will actually cause the # objects to come into existence: # Import xxx.pin; # Elaborates pin and pin-group objects Import aaa.soc; # Elaborates site socket map objects # Other imports as necessary ... Flow Flow 1 ⁇ ... ⁇
  • test program When a test program is compiled, it will elaborate all the objects in the files that are imported by the test plan.
  • the set of files imported by a test plan are topologically sorted to yield an order in which the files are elaborated.
  • the set of files imported by a test plan is referred to as the import closure of the test plan. If the import closure of a test plan cannot be topologically sorted, then there must be an imports cycle. Such a situation is erroneous, and will be rejected by the compiler.
  • the types Integer, UnsignedInteger, Double, and String are referred to as Basic Types.
  • the Basic Types have no measurement units.
  • the Elementary Types which are not basic types are a Double, with an associated measurement unit and a scale.
  • the scaling symbols are common engineering scaling symbols:
  • constants should not be changed once they are defined.
  • the expression bound to a constant can involve previously defined constants and literal values.
  • Variables on the other hand, can be changed via an API.
  • the expression bound to a variable can involve previously defined variables, constants and literal values.
  • Each variable is bound to an expression object which is maintained at runtime. This provides the capability of changing the expression associated with a variable at runtime, and then re-evaluating all the variables.
  • the expression object is a parsed form of the right hand side of a variable or constant definition. In one embodiment, no facility is provided for the changing of constants at runtime. Their value is preferably fixed at compile time.
  • the TestPlan object provides a UserVars class which is a collection that contains names and their associated expressions, values, and types. User variables can go into a Default User Variables Collection, or into a Named User Variables Collection.
  • the UserVars declarations in the example above, which have no specified name, go into the default collection. However, it is possible to explicitly name a collection as follows: # Declare X and Y in the MyVars UserVars collection. UserVars MyVars ⁇ Integer X 2.0; # # Refers to the above X, and to the globally # available MaxInteger from the default # UserVars collection.
  • Integer Y MaxInteger ⁇ X; ⁇ # Declare X, Y1 and Y2 in the YourVars UserVars collection.
  • UserVars YourVars ⁇ Integer X 3.0; # Refers to the X from MyVars.
  • Integer Y1 MaxInteger ⁇ MyVars.X; # Refers to the X declared above.
  • Integer Y2 MaxInteger ⁇ X; ⁇ # More variables being added to the MyVars collection
  • UserVars MyVars ⁇ # # # Refers to X and Y from the earlier declaration # of MyVars.
  • # Integer Z X + Y; ⁇
  • a name is qualified—i.e., a name comprises two segments separated by a dot—then the variable comes from a named user variables collection, named by the segment that precedes the dot. So, MyVars.X above refers to the X in the MyVars collection. The name “_UserVars” can be used to explicitly denote the default user variables collection.
  • a UserVars collection uses a variable from another collection, it preferably uses just the raw value of the variable. No dependency information is maintained between collections. Thus, dependency based re-evaluation can be limited to a single collection.
  • Each user variables collection refers to an instance of a C++ UserVars class.
  • the default object of the C++ UserVars class is named “_UserVars”.
  • Variables in an UserVars declaration that is unnamed are from the default user variables collection, and are added to this default object.
  • Variables in a named user variables collection are added to an object of the C++ UserVars class having that name.
  • the “MyVars” C++ object will end up having the variables X, Y and Z.
  • User variables are implemented as a collection of n-tuples having the name string, a const/var boolean, the type as an enumerated value and the expression as an expression tree.
  • the expression of a name can be set by a call: enum ElemenaryType ⁇ UnsignedIntegerT, IntegerT, DoubleT, VoltageT, ... ⁇ ; Status setExpression(const String& name, const bool isConst, const elementaryType, const Expression& expression);
  • the type Expression is a type that is a parsed form of the text corresponding to the right hand side of an assignment. There will be a globally available instance of UserVars. For example, the set of user variables in limits.usrv (cf.
  • the Expression class preferably has constructors that represent the parsed form of the expression.
  • Expression has several constructors, including one that takes a string literal and parses it, and another that takes a string literal to use just as a string literal. These are distinguished by additional parameters which are not specified above for the sake of readability.
  • User variables in the default user variables collection will be managed by the _UserVars object of class UserVars.
  • User variables in a named user variables collection Xxx will be managed by a UserVars object named Xxx.
  • the C++ UserVars class that contains these names and expressions exports an application programming interface (API) to evaluate and modify these values at runtime. Modification of the expressions associated with UserVars also addresses the issue of when the UserVars will be reevaluated, and what the impact of the evaluation will be.
  • API application programming interface
  • UserVars Collection Re-evaluation is reevaluation limited to a single UserVars collection. The semantics of this operation is to re-evaluate all the variables of this collection once again.
  • UserVars Targeted Re-evaluation is reevaluation limited to a change to the expression bound to a single name. This would enable the user to change the expression of a single name, and cause the re-evaluation of the collection to take place, taking into consideration only this particular change.
  • User Vars Global Re-evaluation is re-evaluation of all UserVars collections. This basically triggers a re-evaluation of all the UserVars collections in declaration order and is quite costly.
  • Multiple collections can refer to variables from one another, but the values bound to the variables are bound at time of use. No dependency is maintained between UserVars collections.
  • the setExpression( ) call can also be used to define a new variable which was not hitherto defined. enum elementaryType ⁇ UnsignedIntegerT, IntegerT, DoubleT, VoltageT, ... ⁇ ; Status getExpression(const String& name, Expression& expression) const; Status setExpression(const String& name, const bool isConst, const elementaryType, const Expression& expression);
  • the setExpression( ) call can fail if the expression results in a circular dependency. For instance if the following two calls were made, the second call would fail with a circular dependency failure
  • the Specification Set is used to supply a collection of variables which can take on values based on a Selector. For example, consider the following Specification Set that uses selectors Minnie, Mickey, Goofy and Daisy: # ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • a specification set a is list of selectors (Minnie, Mickey, Goofy and Daisy in the example above), along with a list of variable definitions (xxx, yyy, zzz and www in the example above).
  • the definition of a variable involves a list of expressions that is either as long as the list of selectors, or comprises a single expression.
  • a specification set can be thought of as a matrix of expressions, whose columns are the Selectors, whose rows are the variables and whose entries are expressions.
  • a particular selector (column) binds each variable (row) to a specific expression (entry). If the list has a single expression, it represents a row with the expression replicated as many times as there are selectors.
  • Specification sets can appear in two separate contexts. They could be separately declared in a .spec file, in which case they appear as shown above. These are named specification sets. Otherwise, local specification sets can be declared within a Test Condition Group. In such a declaration, the specification set will not be provided with a name. It will be a local specification set, of significance only to the enclosing test condition group.
  • Named specification sets can be modeled after the named user variables collection.
  • the above specification set can be modeled as a UserVars collection named Aaa, which will have expressions for xxx[Minnie], xxx[Mickey], xxx[Goofy], xxx[Daisy], yyy[Minnie], and so on.
  • Aaa UserVars collection
  • a particular selector say Mickey
  • the values of xxx, yyy and zzz are obtained from the variable name and the specification set name.
  • a test condition group can have at most one specification set, which is either a local specification set, or a reference to a named specification set. Local specification sets appear only in the context of a test condition group, and have no explicitly specified name. Such a specification set has an implicit name that is defined by the name of the enclosing test condition group. To resolve a name in a test condition group at a point where several specification sets and several UserVars collections are visible, the following rules are applied:
  • # A reference to “xxx” here will resolve in the context # of the local specification set Aaa above.
  • # Rule 3 Resolution in default user variables collection. # A reference to “MaxInteger” here will resolve to limits.usrv. # Error: Resolution of vcc # A reference to vcc does not resolve because it is neither in # the named specification set Aaa, nor in limits.usrv. # Error: Resolution of Aaa.xxx # Looks for a named UserVars collection named Aaa. The named # specification set does not qualify. ⁇
  • Specification sets can be implemented by the C++ SpecificationSet class.
  • the SpecificationSet class has essentially the same API as the UserVars class, except for an extra String parameter for the selector. Consequently, this API is not described in detail.
  • All named specification sets are preferably associated with a C++ object of that name.
  • a local specification set in the context of a test condition group will have a name that is unique to that test condition group. It is illegal to refer to a variable of a local specification set outside the context of the test condition group that it is defined in.
  • Such a declaration specifies the setting of the various parameters of the named pin or pin-group.
  • such a statement could be used to set the VIL values for all pins in the InputPins group, as shown in the example below: # --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Version 1.0; Import pentium3resources.rsc; Import pentium3pins.pin; Levels Pentium3Levels ⁇ # # # Specifies pin-parameters for various pins and # pin groups using globals and values from # the specification set. # # # The order of specification is significant.
  • # Pin parameters will be set in order from # first to last in this Levels section, and # from first to last for each pin or pin-group # subsection.
  • the following statement requires a delay of 10 uS after # the call to set the InPins levels. Actual delay will be # a small system defined range around 10.0E ⁇ 6.
  • # POST_WAIT specifies the time to wait after pattern # generation ends to shut down the power. Actual # wait time will be a small system defined range # around PRE_WAIT (see).
  • each Levels block is preferably made up of a number of levels items, each of which specifies parameters for a pin or pin group. Each levels item can specify a number of resource parameters.
  • the runtime semantics for the setting of these levels values is as follows:
  • the levels items of the Levels block are processed in declaration order. Any pin that occurs in more than one levels item will get processed multiple numbers of times. Multiple specification of values for a single parameter should be maintained and applied in specification order.
  • the Delay statements cause the process of setting levels to pause for approximately the indicated duration, prior to setting the next group of levels.
  • the actual wait time may be in a small system defined range around the specified delay. So if the delay was t seconds, the actual delay would satisfy:
  • the Delay statements divide up the Levels specification into a number of subsequences, each of which will require separate Test Condition Memory settings for processing.
  • MinDelay statements cause the process of setting levels to pause for at least the specified duration prior to setting the next group of levels.
  • the actual wait time may be in a small system defined range with a minimum value of the specified minimum delay. So if the minimum delay was t seconds, the actual delay would satisfy:
  • MinDelay statements divide up the Levels specification into a number of subsequences, each of which will require separate Test Condition Memory settings for processing.
  • Each pin or pin-group name is specified in exactly one resource in a pin description file (suffix pin), and therefore has a certain set of viable resource parameters specified in the resource file (suffix .rsc). All the parameters named must be from among this set of viable resource parameters, and must be of the same elementary type as the expression used to set their value. Information about the names and types of resource parameters comes from the resource file.
  • the resource file Resources.rsc is implicitly imported, providing tester with the names and types for parameters of standard resources such as dpin, and dps.
  • Resource parameters are assigned expressions that can use UserVars, and values from named specification sets or a currently visible local specification set.
  • Dps pin resources have special parameters PRE_WAIT and POST_WAIT.
  • the PRE_WAIT parameter specifies the time that needs to elapse from the time the power pin has reached its destination voltage to the time pattern generation can start.
  • the POST_WAIT parameter specifies the time that needs to elapse from the time pattern generation has stopped to the time the power pin shuts off.
  • Dps pins also specify how the voltage parameter reaches its final value. They could specify it simply by an equation, as all other pin parameters. In that case the value will be reached as the hardware allows it. They could also specify it using a Slew statement.
  • a Slew statement specifies that the power supply voltage reaches its final value from the initial value in a ramp with a specified absolute Voltage Slew Rate.
  • Test Condition Group Sub-language packages together the description of specifications, timings and levels. Timing objects are often specified using parameters. Parameters can be used in timings to specify leading and trailing edges of various pulses. Likewise, Levels can be parameterized by specifying maximum, minimum and typical values of various voltage levels.
  • TCG Test Condition Group
  • a TestConditionGroup declaration contains an optional SpecificationSet.
  • the SpecificationSet declaration may be an inlined (and unnamed) local SpecificationSet, or it may be a reference to a named SpecificationSet declared elsewhere.
  • the optional SpecificationSet declaration in a TCG declaration is followed by at least one Levels or Timings declaration. It can have both Levels and a Timings, in any order. However, it is disallowed from having more than one Levels and Timings declaration. These restrictions are syntactically enforced.
  • a specification set declaration in a TCG is identical to the specification set declared separately, except that it does not have a name. Its name is implicitly the name of the enclosing TCG.
  • the Timings declaration comprises a single declaration of a Timings object from a specified timings file.
  • # min max typ # v_cc 2.9 3.1 3.0 # v_ih vInHigh + 0.0 vInHigh + 0.2 vInHigh + 0.1 # v_il vInLow + 0.0 vInLow + 0.2 vInLow + 0.1 # ... # A reference such as “vInHigh” must be previously defined # in a block of UserVars. # # #Thus, if the “max” selector was selected in a functional # test, then the “max” column of values would be bound to # the variables, setting v_cc to 3.1, v_ih to vInHigh+2.0 # and so on.
  • # # # Note that this is a local specification set, and has no # name.
  • SpecificationSet(min, max, typ) ⁇ # Minimum, Maximum and Typical specifications for # voltages.
  • V ltage v_cc 2.9, 3.1, 3.0;
  • Voltage v_ih vInHigh + 0.0, vInHigh + 0.2, vInHigh + 0.1;
  • Voltage v_il vInLow + 0.0, vInLow + 0.2, vInLow + 0.1; # Minimum, Maximum and Typical specifications for # leading and trailing timing edges.
  • the base # value of 1.0E ⁇ 6 uS corresponds to 1 picosecond, # and is given as an example of using scientific # notation for numbers along with units.
  • the selectors of a specification set be unique identifiers.
  • Each value specified in the specification set is associated with an array of values that exactly the same number of elements as the set of selectors. Picking the i th selector will cause each value to be bound to the i th value of its associated vector of values.
  • Levels declaration is used to set levels for various pin parameters.
  • the variables identified in the specification set will be used to set these levels, permitting a dynamic binding of different actual values for pin parameters based on the selector used to initialize the TCG.
  • Timings object can be initialized based on the selected values of the specification set variables. It is not necessary to have both a Timings and a Levels declaration. Either can be present by itself, or both in any order, as illustrated by the following example: # ------------------------------------------------------------------------------------------------------------------------------------------------------ Version 0.1; # A Levels-only Test Condition Group.
  • Timings there should not be more than one Timings and more than one Levels in a TCG. Thus, in summary, there should be at least one of Timings or Levels, and at most one of each.
  • TestCondition TCMin
  • TestCondition TCMax
  • TestCondition TCTyp
  • Test condition groups have the following runtime semantics:
  • a Test (such as a FunctionalTest) will reference a TCG with a particular selector from its SpecificationSet, using an instantiated TestCondition. This selector will bind each variable in the SpecificationSet to its value associated with the chosen selector. This binding of variables to their values will then be used to determine Levels and Timings.
  • Parameter Levels in a TestConditionGroup are preferably set sequentially, in the order of presentation in the Levels block. So in the Pentium3Levels block, the order in which parameter levels would be set is as follows (notation: ⁇ resource-name>. ⁇ resource-parameter>):
  • This sequencing order enables the test writer to control the explicit power sequencing of power supplies. Furthermore, if a levels item occurs twice, naming the same pin-parameters for a pin, then that pin-parameter gets set twice. This can happen programmatically also.
  • VCC Slew(0.01, 2.0 V);
  • VCC will reach its final value of 2.0 volts from its present value in a ramp with a Voltage Slew Rate of ⁇ 0.01 volts per second.
  • Timings object in the TCG.
  • the Timings object will then be initialized based on the selected variables.
  • Such a mechanism could be used to customize a Timings object, as, for instance, by specifying leading and trailing edges of waveforms.
  • Test Condition Group can be declared in a C++ TestConditionGroup class, and initializing it as follows:
  • TestConditionGroup which will set the specification set for the TestConditionGroup. This may either be a local specification set, or a named specification set, or null (if there is none).
  • Levels object for the TestConditionGroup. This may either be a locally declared levels object, or an externally declared levels object, or null (if there is none).
  • Timings object for the TestConditionGroup. This will be either an externally declared Timings object, or null (if there is none).
  • the Bin Definitions class defines bins, a collection of counters that summarize the results of testing many DUTs. During the course of testing a DUT, the DUT can be set to any bin, e.g., to indicate the result of a particular test. As testing proceeds, the DUT may be set to another bin. The bin that the DUT is finally set to is the last such setting at the end of the test. The counter for this final bin is incremented at the end of the test of this DUT.
  • a separate file with bin definitions should have the suffix .bdefs.
  • Bin definitions are preferably hierarchical. For example, at an outermost level, there may be the PassFailBins with two bins named Pass and Fail. Then there could be several HardBins, some of which map to the Pass bin, and others which map to the Fail bin. The HardBins are said to be a refinement of the PassFailBins. Finally, there could be a large number of SoftBins, a refinement of HardBins, many of which map to the same Hard bin.
  • BinGroup HardBins ⁇ “3GHzPass”: “DUTs passing 3GHz”; “2.8GHzPass”: “DUTs passing 2.8GHz”; “3GHzFail”: “DUTs failing 3GHz”; “2.8GHzFail”: “DUTs failing 2.8GHz”; LeakageFail: “DUTs failing leakage”; ⁇ # The SoftBins are a next level of refinement. # SoftBins are a refinement of HardBins.
  • BinGroup SoftBins HardBins ⁇ “3GHzAllPass”: “Good DUTs at 3GHz”, “3GHzPass”; “3GHzCacheFail”: “Cache Fails at 3GHz”, “3GHzFail”; “3GHzSBFTFail”: “SBFT Fails at 3GHz”, “3GHzFail”; “3GHzLeakage”: “Leakages at 3GHz”, LeakageFail; “2.8GHzAllPass”: “Good DUTs at 2.8GHz”,“2.8GHzPass”; “2.8GHzCacheFail” “Cache Fails at 2.8GHz”,“2.8GHzFail”; “2.8GHzSBFTFail”: “SBFT Fails at 2.8GHz”, “2.8GHzFail”; “2.8GHzLeakage”: “Leakages at 2.8GHz”, LeakageFail; ⁇ ⁇
  • the most base bins are the BinGroup HardBins.
  • a BinGroup X is said to be a group of base bins if some other BinGroup is a refinement of X.
  • the BinGroup HardBins is a group of base bins since the BinGroup SoftBins is a refinement of HardBins.
  • the bins of SoftBins are referred to as leaf bins.
  • a BinGroup Y is said to be a group of leaf bins if no other BinGroup is a refinement of Y.
  • BinDefs block with a single BinGroup Z in it will have Z to be a group of most base bins, as well as a group of leaf bins.
  • BinGroup names are global in scope. There can be any number of BinDefs blocks, but the declared BinGroups must be distinct.
  • a BinGroup from one BinDefs block is allowed to be a refinement of a BinGroup from another BinDefs block. So in the above example, SoftBins could be in a separate BinDefs block from HardBins. However, it is strongly recommended to have a single BinDefs block with all the BinGroups defined for the sake of readability.
  • BinGroup PassFailBins are an outermost level of # bins. They are not a refinement of any other # bins. BinGroup PassFailBins ⁇ Pass: “Count of passing DUTS.”; Fail: “Count of failing DUTS.”; ⁇ # The HardBins are a next level of refinement.
  • HardBins are a refinement of the PassFailBins, # as indicated by “HardBins : PassFailBins”.
  • BinGroup HardBins PassFailBins ⁇ “3GHzPass”: “DUTs passing 3GHz”, Pass; “2.8GHzPass”: “DUTs passing 2.8GHz”, Pass; “3GHzFail”: “DUTs failing 3GHz”, Fail; “2.8GHzFail”: “DUTs failing 2.8GHz”, Fail; LeakageFail: “DUTs failing leakage”, Fail; ⁇ # The SoftBins are a next level of refinement. # SoftBins are a refinement of HardBins.
  • BinGr up SoftBins HardBins ⁇ “3GHzAllPass”: “Good DUTs at 3GHz”, “3GHzPass”; “3GHzCacheFail”: “Cache Fails at 3GHz”, “3GHzFail”; “3GHzSBFTFail”: “SBFT Fails at 3GHz”, “3GHzFail”; “3GHzLeakage”: “Leakages at 3GHz”, LeakageFail; “2.8GHzAllPass”: “Good DUTs at 2.8GHz”,“2.8GHzPass”; “2.8GHzCacheFail”: “Cache Fails at 2.8GHz”,“2.8GHzFail”; “2.8GHzSBFTFail”: “SBFT Fails at 2.8GHz”, “2.8GHzFail”; “2.8GHzLeakage”: “Leakages at 2.8GHz”, LeakageFail; ⁇ ⁇
  • BinGroup PassFailBins are typically not a refinement of any bins.
  • the BinGroup HardBins are a refinement of the PassFailBins and are also base bins.
  • SoftBins are a refinement of the HardBins, and are a group of leaf bins. The above example had only three BinGroups in the hierarchy.
  • Ax and Ay are refinements of A
  • Axx is a refinement of Ax
  • Ayy is a refinement of Ay.
  • This example also provides BinGroups B and Bx where Bx is a refinement of B.
  • the BinDefs declaration above with the BinGroups named PassFailBins, HardBins and SoftBins will be used as a continuing example in this section.
  • Each bin in a BinGroup has:
  • BinGroup the name of the bin it is a refinement of, also known as the base bin.
  • Bin names may be a literal string, or an identifier. Bin names must be unique in a BinGroup, but may be duplicated across BinGroups. BinGroup names, however, are global in scope, and must be unique across a test plan.
  • the bins “3 GHzPass” and “2.8 GHzPass” both map to the “Pass” bin of the PassFailBins.
  • the rest of the HardBins map to the “Fail” bins of the PassFailBins.
  • Bins are assigned to DUTs in a Test Plan FlowItem, described below.
  • a TestPlan FlowItem has a Result Clause in which the test plan describes the actions and transition to take place as the result of getting a particular result back from executing a test. It is at this point that a SetBin statement can occur: # A FlowItem Result clause. It is described later. Result 0 ⁇ # Action to be taken on getting a 0 back from # executing a test. # Set the bin to SoftBin.“3GHZPass” expressing that the # DUT was excellent. SetBin SoftBins.“3GHzPass”; ⁇
  • This DUT passed the 3 GHz Cache and Leakage tests, but failed the SBFT test, and so was assigned to the “3 GHzSBFTFail” bin. It was then tested at 2.8 GHz, and all the tests passed. So the final bin assignment is to the “2.8 GHzAllPass” bin, which is in the set of SoftBins. This final assignment will increment the counters of the following bins:
  • runtime will increment the counter of the final bin assignment of the DUT, and for all other bins it is a refinement of.
  • a SetBin statement is allowed only on a leaf bin. It is illegal to set a base bin.
  • the counter incrementing semantics above assures that:
  • a BinDefinitions declaration is comprised of several BinGroup declarations.
  • Each BinGroup declaration has a name, an optional BinGroup name that it is a refinement of, followed by a block of bin declarations.
  • Bin declarations comprise a name, followed by a description, optionally followed by the name of a base bin that this bin is a refinement of.
  • Bin names can be a string literal, or an Id. The empty string should not be a valid bin name. Bin names should be unique among names in the BinGroup declaration, but the same name could be used in other BinGroup declarations.
  • BinGroup declaration Xxx is a refinement of another BinGroup declaration Yyy
  • all of the bin declarations in Xxx must declare the name of a base bin from Yyy.
  • each of the bin declarations in SoftBins is a refinement of a bin of HardBins, since the SoftBins are declared to be a refinement of HardBins.
  • a BinGroup declaration that is not a refinement of another BinGroup declaration, such as PassFailBins will preferably have Bin declarations that do not declare base bins.
  • a bin Bbb has a set of bases which is the entire set of bins that Bbb is a refinement of. It is formally defined as follows:
  • Aaa is the base bin of Bbb, then Aaa is in the set of bases of Bbb.
  • Any base of Aaa is also in the set of bases of Bbb.
  • BinGroup names are global in a TestPlan.
  • Bin names are local to a BinGroup.
  • a SetBin statement is only allowed for a leaf bin.
  • BinGroup can be constructed for each of the BinGroup declarations in the BinDefs declaration.
  • the class BinGroup will have a subclass LeafBinGroup.
  • the operations of these two classes are the same, except that BinGroup::incrementBin is a C++ protected operation, whereas LeafBinGroup::incrementBin is a C++ public operation.
  • TestPlan state will be include number of BinGroup members, one for each BinGroup declaration.
  • the C++ for the above BinDefinitions would be as follows: // TestPlan constructor TestPlan::TestPlan() : m_PassFailBins(),// Default Constructor m_HardBins(&m_PassFailBins), m_SoftBins(&m_HardBins) ⁇ ⁇ // Bin initializations m_PassFailBins.addBin(“Pass”,“Count of passing DUTS.”,“”); m_PassFailBins.addBin(“Fail”,“Count of failing DUTS.”,“”); m_HardBins.addBin(“3GHzPass”, “Duts passing 3GHz”,“Pass”); ...
  • State for a TestPlan includes a m_pCurrentBinGroup which is initialized to the undefined BinGroup (NULL) and the m_currentBin undefined bin name (the empty string).
  • the m_pCurrentBinGroup is changed to the indicated the named BinGroup and the m_currentBin to the named bin in the group by a call: // Translation of: SetBin SoftBins.“3GHzAllPass”; pTestPlan->setBin(“SoftBins”,“3GHzAllPass”);
  • the test plan completes execution, it will call m_pCurrentBinGroup ⁇ >incrementBin(m_currentBin);
  • BinGroup counters are reset when the test plan is elaborated, but are not reinitialized each time a test is run.
  • the counters can be reset by an explicit call to BinGroup::resetBin.
  • the test plan can be thought of as a main structure of the test program.
  • the Test Plan can import files, as well as define similar constructs inline. Thus, it is possible to import a file given definitions of some globals, as well as declaring additional globals inline.
  • a Flow encapsulates a finite state machine. It comprises several FlowItems which run an IFlowable object and then transition to another flow item. Running an IFlowable involves running an object that implements the IFlowable interface. Typical objects that implement the IFlowable interface are Tests and Flows themselves.
  • a Flow has FlowItems which runs Tests and other Flows, and then transition to another FlowItem. It also provides for the opportunity to call user customized routines on various return results from running an IFlowable.
  • a Flow thus has the following form: # # FlowTest1 implements a finite state machine for the # Min, Typ and Max flavors of MyFunctionalTest1. On # success it tests Test1Min, Test1Typ, Test1Max # and then returns to its caller with 0 as a successful # status. On failure, it returns 1 as a failing status. # # Assume that the tests MyFunctionalTest1Min, ...
  • FlowTest1 will, on a successful run, run a device through the minimum, typical and maximum versions of Test1, and then return.
  • FlowTest2 will operate in a like manner.
  • a Flow as described above basically describes a Finite State Machine with states and transitions.
  • the FlowItems are basically states, which will do the following:
  • a FlowItem has the following components:
  • a FlowItem has a name.
  • a FlowItem has an IFlowable to be executed.
  • a FlowItem has a number or Result clauses.
  • Each Result clause of a FlowItem provides actions and ends with a transition and is associated with one or more result values.
  • the IFlowable to be executed could be either a Test, or a User-defined IFlowable, or a Flow.
  • the actions for a result could be any of the following:
  • Properties are basically named string or integer valued entities that are associated with a Result clause. There can be any number of them, and they are preferably used by tools such as GUIs which a user would use to display information associated with this result. They have no effect on the actual result of the test, or the flow of the test.
  • Routine Call Action to call an arbitrary or user routine. This is discussed later.
  • a FlowItem has a Transition which could either be a GoTo statement to transfer control to another FlowItem, or a Return statement to transfer control back to the caller (either a calling flow, or the system routine which initiated the test plan).
  • Flow objects are also executed in response to other events.
  • TPS Test Plan Server
  • the name in parentheses is the name used in assigning Flows to these events.
  • System Load Flow (SysLoadFlow). This Flow is executed on the System Controller when a Test Plan is loaded onto one or more Site Controllers. It is executed prior to the actual loading of the Test Plan on any Site Controller. This flow allows the Test Plan developer to define actions that should originate from the System Controller. Such actions include broadcast load of Pattern files, Calibration actions, etc.
  • Site Load Flow SiteLoadFlow
  • This Flow is executed on the Site Controller after a Test Plan has been loaded onto the Site and initialized. This allows any Site-specific initialization to occur.
  • Lot Start/End Flows (LotStartFlow/LotEndFlow). These Flows execute on the Site Controllers when the Test Plan Server is notified of a start of a new lot. This is typically used in production environments to annotate datalog streams with lot-specific information.
  • DUT Change Flow (DutChangeFlow). This Flow executes on the Site Controller when its DUT information changes. Again, this is typically used in production environments to update datalog streams.
  • TestPlan Start/End Flows (TestPlanStartFlow/TestPlanEndFlow). These Flows execute on the Site Controller when the Test Plan Server is instructed to start executing the current Test Flow and when that flow finishes its execution.
  • Test Start/End Flows (TestStartFlow/TestEndFlow). These Flows execute on the Site Controller when the Test Flow is starting to run a new Test and when that Test finishes its execution.
  • Test Flow This Flow is the main Flow object executed when the Test Plan Server receives an “Execute Test Plan” message.
  • Flows are given along with comments that describe the finite state machine implemented by the flow.
  • the finite state machine is given as a transition matrix. Rows of the matrix correspond to FlowItems, and columns to the result. The entries of a row of the matrix indicate the FlowItem that is transitioned to from the FlowItem of the row when the returned Result is the value specified in the column.
  • FlowTest1 will operate as described above. It will run a test named MyFunctionalTest1 in each of the “min”, “typ” and “max” configurations. Likewise, FlowTest2 will run MyFunctionalTest2 in each of these configurations. Finally, FlowMain will run FlowTest1 and FlowTest2. The finite state machine transition matrix is provided in comments at the start of each of these flows.
  • Test Condition Group TCG1 is selected with # the “min” selector by referring to the TC1Min TestCondition.
  • a Flow is an object that # essentially represents a finite state machine which # can execute “Flowables”, and transition to other flowables based # on the Result returned from executing a Flowable.
  • a Flow can also # call another flow.
  • # # A Flow consists of a number of Flow Items and transitions # between them. FlowItems have names which are unique in # the enclosing Flow, execute a “Flowable” object, and then # transition to another FlowItem in the same enclosing Flow.
  • # # Flowable objects include Tests and other Flows.
  • # # FlowTest1 implements a finite state machine for the # Min, Typ and Max flavors of MyFunctionalTest1. On # success it tests Test1Min, Test1Typ, Test1Max # and then returns to its caller with 0 as a successful # Result. On failure, it returns 1 as a failing Result. # # Assume that the tests MyFunctionalTest1Min, ...
  • test plan is structured as follows in a preferred order:
  • Test Plan name is declared, after which come the inline declarations of the test plan.
  • PListDefs are declared. These include file-qualified names naming GlobalPLists from the named files. They also include Pattern List variables. Pattern List variables are variables that can be initialized in custom flowables at execution time. They provide a means of delaying binding tests to actual pattern lists until runtime.
  • Counters are then declared, to determine the number of tests passed and failed. Counters are simply variables that are initialized to zero, and incremented at IncrementCounter statements. They are different from Bins described earlier which have the semantics that only the currently set bin is incremented at the end of the test of a DUT.
  • Test Condition Groups come from mytestconditionsgroups.tcg. However, they could have been inline in the test plan.
  • Test FunctionalTest which selects a Pattern List and a test condition.
  • MyFunctionalTest1Max selects the test condition TC1Max and a pattern list.
  • FlowTest1 FlowTest1
  • FlowTest2 FlowMain.
  • Flows run Flowables.
  • Flowables include Tests (such as MyFunctionalTest1Max) and other flows (such as FlowTest1 and FlowTest2).
  • Tests such as MyFunctionalTest1Max
  • FlowTest1 and FlowTest2 run through the minimum, typical and maximum versions of Test1 and Test2 respectively.
  • the flow FlowMain calls the earlier declared flows, FlowTest1 and then FlowTest2.
  • TestFlow event is assigned to the FlowMain Flow.
  • the flow FlowMain is the one that will be executed by this test plan when a user chooses to Execute this plan.
  • the C++ class to represent a FlowItem may have the following interface:
  • IncrementCounters A, B, C; would preferably use the above call as follows: // Somewhere earlier CounterRefList counters; ... // Code for Result clause // Result 2, 3 ⁇ ... ⁇ // of flowObject. counters.reset( ); counters.add(&A); counters.add(&B); counters.add(&C); flowObject.setCounterRefs(2, counters); flowObject.setCounterRefs(3, counters);
  • a temporary CounterRefList object named counters is used. Initially counters.reset( ) is called, followed by a number of counters.add( ) calls to set up the counters list. This is then used to setup the vector of counter addresses to be updated for result values 2 and 3.
  • the FlowItem may then need to transition to another FlowItem on a particular result:
  • the FlowItem may need to return a result. This is done by:
  • This operation will execute the IFlowable, then update the indicated counters, and then either return a Result, or a pointer to the next FlowItem. If this pointer is NULL, then the result is the returned value.
  • Counters are variables that are initialized to zero, and can be incremented by an IncrementCounter statement at various points during a test run. They are different from Bins, which are incremented only at the end of the test. Furthermore, bins are hierarchical while counters are simple variables. Thus, counters are a much simpler and more limited facility than bins.
  • Counters can be supported in a TestPlan via a member of a Counters class that maintains a set of named counters which are unsigned integers. Objects will be defined in this class via a Counters declaration. Counters will not be automatically reset when a test starts, thus allowing a TestPlan to gather counts over testing many DUTs. Methods will be provided to reset, increment and query the value of a counter. This enables an alternative to binning in order to determine counts as a result of running a test.
  • the TestPlan preferably contains a member variable, m_modifiedCounters, which is the set of counters modified by running the test on a DUT. This set is initialized to the empty set at the start of the test. At each place an IncrementCounters call is made, code will be generated to add the named counters to the m_modifiedCounters member. Thus, this member gathers together all the counters that were modified during the execution of a test on a DUT.
  • m_modifiedCounters is the set of counters modified by running the test on a DUT. This set is initialized to the empty set at the start of the test. At each place an IncrementCounters call is made, code will be generated to add the named counters to the m_modifiedCounters member. Thus, this member gathers together all the counters that were modified during the execution of a test on a DUT.
  • the Flow object can be created as a C++ object as shown below:
  • This will preferably return when the Flow returns, with the result of executing the flow.
  • the action of this is to start executing the flow with the initial FlowItem. It will keep executing FlowItems as long as the current FlowItem returns a next FlowItem to execute. When the current FlowItem returns a Result, then this operation completes with that Result.
  • the C++ code generated for a Flow has several repeated calls to addFlowItem( ) in order to add FlowItems to the Flow.
  • the executeFlow( ) operation will occur when this Flow in the Test Plan is selected for execution.
  • test code In general majority of the program code is data for device test, and the rest is the code of test program, which realizes the test methodology. This data is DUT-dependent (e.g., power supply conditions, signal voltage conditions, timing conditions, etc.).
  • the test code consists of methods to load the specified device conditions on to ATE hardware, and also those needed to realize the user specified objectives (such datalogging, etc).
  • test code should be independent of any device-specific data (e.g., pin name, stimulus data, etc.), or device-test-specific data (e.g., conditions for DC units, measurement pins, number of target pins, name of pattern file, addresses of pattern programs, etc.). If code for a test is compiled with data of these types, the reusability of the test code would decrease. Therefore, any device-specific data or device-test-specific data should be made available to the test code externally, as inputs during code execution time.
  • device-specific data e.g., pin name, stimulus data, etc.
  • device-test-specific data e.g., conditions for DC units, measurement pins, number of target pins, name of pattern file, addresses of pattern programs, etc.
  • Test Class which is an implementation of the ITest interface, realizes the separation of test data and code (and hence, the reusability of code) for a particular type of test.
  • a test class could be regarded as a “template” for separate instances of it, which differ from each other only on the basis of device-specific and/or device-test-specific data.
  • Test classes are specified in the test plan file. Each Test class typically implements a specific type of device test or setup for device test. For example, Functional, AC and DC Parametric tests are preferably implemented by separate Test classes. However, custom test classes can also be used in test plans.
  • Test classes allow the user to configure class behavior by providing parameters that are used to specify the options for a particular instance of that test. For example, a Functional Test will take parameters PList and TestConditions, to specify the Pattern List to execute, and the Level and Timing conditions for the test, respectively. Specifying different values for these parameters (through the use of different “Test” blocks in the test plan description file) allows the user to create different instances of a Functional Test.
  • FIG. 5 shows how different test instances 502 would be derived from a single test class 504 .
  • Test class instances may be added to objects describing test flow to create a complex execution sequence of device tests.
  • Test classes derive from ITest. With the above rules, these can be implemented in C++ classes that implement the ITest interface. In addition to the methods specified for the ITest interface, these classes provide the Test-specific intelligence and logic required to perform specific classes of device test. Test classes also implement the IFlowable interface. As a consequence of this, instances of Test classes can be used in FlowItems to run tests.
  • Customization mechanisms are provided to allow users to call C functions, and develop their own classes implementing the ITest and IFlowable interfaces.
  • Introspection refers to the ability to ask an object to look within itself and return information regarding its attributes and methods. Some languages, such as Java, provide this ability as a part of the language. Other languages, such as Visual Basic, impose such a requirement on objects intended to be used with it. C++ makes no provisions for this feature.
  • a single source is preferred: one would not want to have the description of the parameterization interface of a Test class in one file, and the C++ interface description in another independent (header) file, and then be burdened with the need to keep both sources synchronized.
  • the “text-based” description is embedded in a pre-header file for the Test class, which is used by the compiler for limited introspection, as well for generating the C++ header for the Test class.
  • the generated C++ header file is the one used to finally compile the Test class C++ code.
  • headers in C++ are well known. Because C++ is difficult to parse and read, however, an embodiment of the invention defines a syntax allowing the compiler to create a C++ output which can be used as a header by a test class developer. According to this embodiment, the test class developer writes a pre-header, which is output by the compiler 400 as a header file, allowing visibility into the corresponding test classes or other test entities.
  • the compiler needs to know what a FunctionalTest entails in order to determine whether the declaration of FuncTest1 above is legal. Rather than building in the knowledge of a FunctionalTest into the compiler, the definition of what a FunctionalTest entails can be specified in the Pre-Header.
  • FunctionalTest is a C++ class having base classes Test1 and Test2, and having members which are a PList, and an array of TestConditions.
  • the compiler needs to know about the types of the members of FunctionalTest in order to recognize that the above declaration of FuncTest1 is legal.
  • the pre-header sub-language of an embodiment of the invention provides the compiler with the information it needs to both recognize the legality of declarations, and to generate C++ headers and object declarations that correspond to declaration.
  • the compiler processes a pre-header file, it builds up the values of the compiler variables such as $Inc, $Class, $ParamAryTypes and others. This enables it to then create the following C++ header by generating the C++ code above verbatim, and expanding in the values of the compiler variables $Inc, $Class, etc. at the indicated places.
  • FunctionalTest.ph it creates the following C++ header file FunctionalTest.h for the FunctionalTest class.
  • this pre-header enables the compiler to check the validity of a FunctionalTest declaration, to generate code for it, and to generate a C++ header that would be needed by it.
  • the pre-header supports some other user defined enumerations as an additional type. This allows the GUI to provide a drop down list of possible choices that could be used for setting the value of a particular parameter. Furthermore, the pre-header provides a feature to associate a number of parameters that can be thought of as a table. For example, it may be convenient to implement an array of “properties” as an associated set of an array of strings for the names, and an array of integers for the values. One easy way of implementing this feature is to use an array of custom types (discussed later). However, that requires the user to write a custom type pre-header to use.
  • the C++ code that would be generated by compiler for MyFunctions above is to simply declare some functions in the MyFunctions namespace: namespace MyFunctions ⁇ double Min(ITestPlan* pITestPlan, int& x, int& y); double Avg(ITestPlan* pITestPlan, double* a, const int a_size); void Print(ITestPlan* pITestPlan, char* Msg, unsigned int dutID); ⁇
  • the following declaration specifies that a MyFlowable has # - 1 mandatory parameter Int2 of type Integer # - [represented by C++ type int] # - stored in a member named m_int2Val # - a function to set it named setInt2Val.
  • the following declaration specifies that a MyFlowable has # - one or more parameters of type String # - [represented by C++ type Tester::String] # - stored in a member named m_stringArrVal # - a function to set it named addStringVal.
  • # # # Everything in this section will be reproduced verbatim in the # generated header file, except for “$Class”, “$Inc”, # “$ParamAryTypes”, “$ParamAttrs”, “$ParamFns” and “$ParamImpls”. # # Note that no comments beginning with the ‘#’ character are supported # within the following section. # CPlusPlusBegin $Inc namespace ⁇ class $Class ⁇ // Array types for parameters storage: $ParamAryTypes public: virtual void preExec( ); virtual void exec( ); virtual void postExec( ); $ParamFns // ... private: double m_someVar; $ParamAttrs // ... ⁇ ; // ... $ParamImpls ⁇ // End namespace CPlusPlusEnd
  • test class parameterization only allowed for test class parameters to be of known types, viz., elementary types and tester-defined types such as PLists, and TestConditions.
  • types that are unknown a-priori to the compiler
  • custom types C-language structs (also referred to as Plain Old Data types, or PODs, which are quite different from their namesakes in C++) as well as for types corresponding to C-language typedefs for function signatures.
  • PODs Plain Old Data types
  • a separate file with user types will have the extension .ctyp.
  • CustomTypes ⁇ # A structured Plain-Old-Data type Pod Foo ⁇ String S1; # String is a standard type Integer I1; # ... and so is Integer String S2; ⁇ # Another structured type using Foo Pod Bar ⁇ Foo Foo1; String S1; Foo Foo2; ⁇ # # A pointer to a function.
  • CustomTypes declaration presented above will be translated by the compiler into the following C++ code: namespace CustomTypes ⁇ struct Foo ⁇ Tester::String S1; int I1; Tester::String S2 ⁇ ; struct Bar ⁇ Foo Foo1 Tester::String S1; Foo Foo2; ⁇ ; typedef int (*BinaryOp) (int&, int&); typedef void (*UnaryOp)(int); typedef void (*NullaryOp)( ); ⁇
  • Custom Types i.e., a .ctyp file.
  • customTypes ⁇ Pod Foo ⁇ String name; PList patternList; ⁇ Pod Bar ⁇ Foo someFoo; Double dVal; ⁇ Routine BinaryOp(Integer, Integer) return Integer; ⁇
  • CustomVars defines variables of the Custom # types defined earlier.
  • CustomVars ⁇ ... Bar bar1 ⁇ ⁇ ”This is a Foo”, somePatList ⁇ , # someFoo 3.14159 # dVal ⁇ # # A function object that is a binary operator.
  • # The name on the right hand side of the assignment # is a routine declared in MyFunctions, for which, # of course, the user has to provide an implementation.
  • a pre-header for a Test class, custom Flowable class, or custom function definitions offers limited introspection into the class/functions through a parameterization specification section.
  • the compiler uses this section to generate the parameterization interface for the class/function (and generate the class/function header itself).
  • For Test classes and Flowable classes it also uses this section to subsequently generate the calls in the Test Plan code to initialize an instance of that class.
  • Every Test or custom Flowable class definition is preferably specified in a pre-header.
  • the Parameters block in the pre-header is preferably the only place where the parameters list for such a class can be specified. (Thus, as a corollary, the “standard” parameters for a Test, such as pattern list and test condition specifications, also need to be included in the pre-header's Parameters block; this allows all parameters, standard and CTs, to be treated uniformly.)
  • the name of a parameter specification in the Parameters block of the pre-header (such as PListParam, TestConditionParam or BarParam in the examples above) is the name of the parameter to be used in the declaration of an instance of that class.
  • ii 0-1 This parameter is optional; if specified, it must be specified only once. This parameter will be maintained as a pointer to an object of the type of the parameter.
  • iii 1-n This parameter is mandatory. Moreover, multiple values can be specified for this. The values will be stored in the order of specification.
  • iv 0-n This parameter is optional. Multiple values can be specified for this. The values will be stored in the order of specification.
  • PListDefs ⁇ # File qualified pattern list names pl1A.plist:pat1Alist, pl2A.plist:pat2AList, # Pattern list variables plistXxx, plistYyy, plistZzz ⁇ # SocketDef, UserVars declaration as before ... # Declarations of TestConditions TC1Min, TC1Typ, TC1Max, # TC2Min, TC2Typ, TC2Max as before ... # # Declare a FunctionalTest. “FunctionalTest” refers to a C++ # test class that runs the test, and returns a 0, 1 or 2 as # a Result.
  • Test Condition Group TCG1 is selected with # the “min” selector by referring to the TC1Min TestCondition. # # # Note that compiler can compile this because of the imported # FunctionalTest.ph file.
  • the PListDefs section here has some PList names and also some PList variables.
  • the PList names are names that can directly be used in tests.
  • the PList variables are variables which can be used in tests, and whose value is bound at runtime to actual PLists by code in a customized Flowable.
  • the PListDefs section is optional. If not present, its contents will be inferred by compiler from the various Test declarations. If present, it must declare all of the used PList parameters of Tests, though it may declare more.
  • TestPlan class will have a function:
  • the Flowable will be able to use the above function to bind a PListVariable to a particular PList.
  • the Flowltem::execute( ) operation knows the name of the flow item. Before it returns with the pointer to the next flow, it will call IUserCalls::exec( ) for the enclosing flow, passing its own flow item name, and the value of the current result. This will cause the above code to be executed, invoking the needed user defined functions.
  • the Test Plan description file specifies the objects used in a test plan and their relationships to one another.
  • this file is translated to the C++ code that will be executed on the Site Controller in the form of an implementation of a standard interface ITestPlan.
  • This code can be packaged into a Windows dynamic link library (DLL) which can be loaded onto the Site Controller.
  • DLL Windows dynamic link library
  • the Test Program DLL is generated to have standard known entry points that the Site Controller software can use to generate and return the TestPlan object it contains.
  • test program compiler 400 The process of conversion from a test plan description to an implementation of ITestPlan is accomplished by the test program compiler 400 . This process occurs in two phases: translation and compilation.
  • the compiler 400 processes a test plan file (and the various other files it imports), as well as the pre-headers for all the test types used in the test plan. In this phase, it creates the C++ code for the Test Plan object and the C++ headers for the test types encountered, along with all other supporting files, such as MSVC++(Microsoft Visual C++) workspace and project files, DLL “boilerplate” code, etc.
  • the compiler 400 inserts file and line directives into the generated code to ensure that compile-time error messages refer back to the appropriate location in the description file instead of pointing into the generated code.
  • a standard compiler 404 such as an MSVC++ compiler, is invoked to compile the files and link them into a DLL.
  • the compiler takes, as input, a valid test plan file (and all related files), and generates, as necessary, a TestPlan file and all other files represented by “Import” directives in the test plan file. In addition, it generates a MSVC++ “Solution” to build the Test Plan DLL. For example, if the main file (MyTestPlan.tpl) included Timing1.tim to incorporate timing information, then the compiler would create (among others) the following files:
  • the compiler invokes the MSVC++ application, specifying the “Solution” it created, and builds the DLL. Any errors and/or warnings would be shown to the user.
  • the Site Controller software loads the Test Program DLL into its process space and calls a “factory” function within the DLL to create an instance of the Test Plan object. Once the Test Plan object has been created, the Site Controller software can then execute the test plan or interact with it in any other way necessary.
  • test plan developers will need to edit code and build their Test Plans. However, tester will not require the Test Plan developer to bring up a C++ development environment in order to produce the resulting Test Plan DLL.
  • a non-interactive build is defined as a build that uses MS Visual C++ in a non-interactive mode. Note that this still allows other tools to be used interactively to manage such a build. The only implication is that Visual C++ is used non-interactively.
  • Test Plan developer will be developing his Test Plan according to above methods and rules.
  • Test Plan developer may not have a expert level knowledge of C++.
  • Test Plan developer will have access to command-line tools or GUI tools to convert file(s) to a Test Plan DLL.
  • solutionFile is a Visual Studio solution file and solutionCfg is a specific configuration applicable to the projects within the solution.
  • Another solution is to use the Visual Studio Object Model for Automation. This allows a finer grain of control over the build and configuration process. As mentioned above, it contains a listing of a Perl script to build a project from the command line. This program reads a configuration file which specifies projects and configurations to build (as well as other information about the projects) and builds them all using the Automation Model. Look at the uses of the $msdev object in this script for examples of how to use Automation objects in a script.
  • This section describes the general software environment for the Tester: the locations for the files required by user test plans, mechanisms for specifying alternate locations for such files, and the methods for specifying the locations of the test plans and module control software.
  • [0702] required by a test plan may be configured by “environment” variables, as specified by environment configuration files. These are text files, with a simple syntax such as:
  • Tester_PATOBJ_PATH “patterns ⁇ data;D: ⁇ projects ⁇ SC23 ⁇ patterns ⁇ data”
  • Pattern object files Tester_PATOBJ_PATH.
  • Pattern source files Tester_PATSRC_PATH (this is optional; please see).
  • Timing data files Tester_TIMING_PATH.
  • Test class DLLs Tester_TEST_CLASS_LIBPATH.
  • a system environment setup file $Tester_INSTALLATION_ROOT ⁇ cfg ⁇ setups ⁇ Setup.env, will specify the default values of “environment” variables. If no other configuration mechanism is available, this file will be required. In general, it will be available for all test plans run on the system.
  • This file is created by the Installation and Configuration Management (ICM) system during installation, with input from the installer to assign the default values for the three variables mentioned above. (Note that besides the system defaults for the above three variables, this file will also contain the system defaults for certain other tester “environment” variables, as described in the following sub-section.)
  • an environment setup file may be specified by the user as a runtime argument to the test plan.
  • the variables in this runtime configuration will take precedence over default definitions.
  • test plan may use a special block to specify the environment variables to be used in its execution. Variables defined in the test plan will take precedence over those in the default system file or the user-defined file.
  • Tester_TEST_PLAN_LIBPATH This specifies the search path that the System Controller will use for finding a user test plan DLL that should be loaded. Note that the same search path will also be used for finding user pin description and socket files. The default value for this variable, specified during installation time to the ICM, is stored by the ICM in the file $Tester_INSTALLATION_ROOT ⁇ cfg ⁇ setups ⁇ Setup.env.
  • Tester_MODULE_LIBPATH This specifies the search path that the system will use to load vendor-provided hardware module control software DLLs. This information, extracted from the Configuration Management Database (CMD), is also stored in the file $Tester_INSTALLATION_ROOT ⁇ cfg ⁇ setups ⁇ Setup.env by the ICM.
  • CMD Configuration Management Database
  • Relative pathnames in the search paths will be interpreted as being relative to a particular setting of a related environment variable (that provides the functionality of defining a root), as paths relative to the “current working directory” (CWD) could lead to ambiguous results, since the notion of a CWD in a distributed environment—such as the one in which the tester works—might not be what the user intuitively expects it to be.
  • This related environment variable which designates the root that all relative pathnames in the search paths will be assumed to be relative to, is the “Tester_INSTALLATION_ROOT” variable, which gives the location of the top-level (i.e., “root”) directory of the tester installation on a user's system.
  • the search path directories will be searched in the order they are encountered in the definition. The first occurrence of a file will be the one chosen.
  • test vectors can generally be categorized as sequential (or linear), scan or Algorithmic Pattern Generator (APG)-derived.
  • APG Algorithmic Pattern Generator
  • test vectors are organized in terms of patterns that are applied to the DUT at test time.
  • a pattern is represented by a Pattern object in the user's test program.
  • patterns are organized in pattern lists, represented programmatically by pattern list objects.
  • a Pattern List object represents an ordered list of patterns or other pattern lists. The ordering is implicit in the order of declaration of the list components. Note that if only a single pattern is needed, it is required to be encapsulated in a list by itself.
  • a pattern list object in the user's test program is associated with a pattern listfile on disk, which contains the actual definition of the pattern list.
  • the contents of a pattern list are thus dynamically determined by the contents of the associated disk file (more will be said about this later).
  • pattern list provides an explicit name for the pattern list, and identifies an ordered list of patterns and/or other pattern lists through file name associations. It also provides for the specification of execution options, which will be described in detail after the pattern objects have been described, since the options can be applied to both pattern lists and patterns.
  • the pattern list should follow the following rules: file-contents : version-info global-pattern-list-definitions version-info : Version version-identifier ; global-pattern-list-definitions : global-pattern-list-definition global-pattern-list-definitions global-pattern-list-definition global-pattern-list-definition : global-pattern-list-declaration ⁇ list-block ⁇ global-pattern-list-declaration : GlobalPList pattern-list-name options opt list-block : list-entry list-block list-entry list-entry : pattern-entry ; pattern-list-entry ; global-pattern-list-definition ; local-pattern-list-definition ; pattern-entry : Pat pattern-name options opt pattern-list-entry : PList pattern-list-reference options opt pattern-list-reference : pattern-list-qualified-name file-name ‘:’ pattern-list-qualified-name pattern-list
  • version-identifier A sequence of one or more characters from the set [0-9.], where the first character must be a digit.
  • pattern-list-name A sequence of one or more characters from the set [a-zA-Z — 0-9], where the first character must be from the set [a-zA-Z_].
  • file-name A valid Windows file name (must be enclosed in double quotes if any white-spaces are contained in the file name). Note that this should be a simple file name, i.e., it should not have a directory component.
  • a pattern-list-reference can be either internal referring to a pattern list in the same file, or external referring to one in another file. External references need to be qualified by a file-name.
  • option-name A sequence of one or more characters from the set [a-zA-Z — 0-9], where the first character must be from the set [a-zA-Z_].
  • option-parameter A sequence of one or more characters from the set [a-zA-Z — 0-9].
  • Pattern list files support comments, which are meant to be ignored by a pattern list file parser. Comments start with the ‘#’ character, and extend to the end of the line.
  • a global-pattern-list-definition or a local-pattern-list-definition declares the name of a pattern list.
  • a pattern-list-reference references the name of a declared pattern list.
  • the names of global pattern lists are globally known.
  • the names of local pattern lists are known only in the list-block in which they are declared. They can be referred to without qualification directly in that list block. In a more deeply nested declaration, a local pattern list will need to be referred to by a qualified name.
  • Local pattern list names are known within the scope of an enclosing pattern list, and global pattern list names known within the scope of the system.
  • GlobalPList G1 ⁇ LocalPList L1 ⁇ LocalPList L2 ⁇ ... ⁇ GlobalPList G2 ⁇ ... ⁇ PList L2; # OK.
  • Name L2 is known in this scope
  • Name G2 is global ⁇ PList L2; # Error. Name L2 is not known here.
  • Name L1 is known here.
  • L2 is known by # qualification.
  • PList G1.L1.L2; # OK. Qualification by G1 is not needed but # is allowed.
  • Name G2 is global ⁇
  • Global pattern lists may be defined at an outermost level in a pattern list file, or may be defined as nested within an enclosing pattern list. The nesting is merely a convenience, however. They are conceptually defined as global pattern lists at the outermost level in the file.
  • a nested global pattern list is semantically equivalent to an outermost (non-nested) global pattern list of the same name. So for example: GlobalPListG1 ⁇ GlobalPList G2 ... ⁇ is semantically equivalent to: GlobalPList G1 ⁇ PList G2; # References G2 ⁇ GlobalPList G2 ...
  • Local pattern lists are always have their definitions nested within an enclosing pattern list which also determines the scope of the name of the local pattern list. Local pattern lists are uniquely named within their enclosing pattern list. Local pattern lists are syntactically disallowed from occurring at the outermost level in a pattern list file.
  • GlobalPList G1 ⁇ LocalPList L1 ⁇ ⁇ LocalPList L2 ⁇ LocalPList L1 # OK.
  • No local name L1 is declared directly # in the enclosing scope defined by L2.
  • ⁇ ⁇ PList L1 ; # OK. Refers to L1 declared in L2 PList G1.L1; # OK. Refers to L1 declared in G1.
  • Each pattern list file contains the definition for one or more global pattern lists. This follows directly from the syntax. The outermost level is a global-pattern-list-definition, and there must be at least one of them.
  • the pattern-name is a reference to a pattern, following the Pat keyword. It references a pattern that is in a pattern file whose name is obtained by concatenating a suffix pat to the pattern name.
  • the file denotes a file that will be obtained along a search path defined for patterns.
  • a pattern-list-reference is a reference to a pattern list following the PList keyword.
  • the reference consists of an optional filename followed by a qualified pattern list name which is just a list of names separated by dots. So, for instance, the following could be a pattern-list-reference:
  • the leftmost name segment must resolve to either a global pattern list, or else to a local pattern list that is visible from the point of reference.
  • Each name segment resolves to a name declared in the context of the prefix before it.
  • the leftmost name segment can be resolved to a global pattern list named in the file by adding the .plist suffix to the leftmost name segment.
  • the above rules dictate that the leftmost name segment resolves to either a local pattern list that is visible from the point of reference, or else to a global pattern list.
  • the name L2 is not declared in this scope.
  • # though L2 is declared in the enclosing scope, this scope # is global, and so no further enclosing scope is examined.
  • PList L2; PList G1.L1; # OK. Refers to L1 in G1. # Error. G3 is not really nested inside G1. Since G3 # is global, it is really declared at an outermost level, # and so G1.G3 is meaningless. PList G2.G3.L3; ⁇ LocalPList L3 ⁇ # OK. Refers to G2.L2. The enclosing global scope is G2 # and the name L2 is declared in G2. PList L2; ⁇ ⁇
  • a pattern list reference can refer to a pattern list defined either before or after the reference in the same file.
  • FIG. 6 illustrates a pattern compiler 602 and a pattern loader 604 according to an embodiment of the present invention.
  • the user-defined contents of a pattern are available in a pattern source file 606 , which is a plain text file.
  • a pattern compiler will be responsible for compiling a source file into a module-specific format suitable for loading on the tester hardware; this latter file will be referred to as the pattern object file.
  • a Pattern object is not creatable by the user; rather, the user always deals with pattern lists, which are collections of other pattern lists and/or patterns.
  • a pattern list object creates, owns and maintains the pattern objects contained within it, while making them accessible to the user if necessary.
  • a pattern is uniquely named within a test plan, i.e., no two patterns within the test plan. can have the same name.
  • the name of a pattern is distinct from the name of the file containing it.
  • the pattern file name is the one used in the pattern list file to refer to a pattern, while the actual name of the pattern is defined in the pattern file.
  • a single DUT (device-under-test) might be connected to tester modules from different vendors. This has implications for the entire pattern compile-load-execute chain. The main ones are described in this section.
  • a pattern compiler 602 thus needs to target a specific site configuration (in terms of the vendor-specific digital modules used).
  • module will be used to refer to a digital module, as an example.
  • the following procedures are preferred:
  • Each module vendor will be responsible for providing its own module-specific pattern compiler 610 , in the form of a dynamically loadable library or separate executable.
  • This compiler library/executable will provide, at the very least, a well-known compile( ) function that takes as arguments
  • the pattern source file will accommodate two different types of sections:
  • a vendor's compiler will not directly create a pattern object file. Instead, the tester will provide for a pattern object “metafile” 612 , managed by an Object File Manager (OFM) 614 , which is part of the pattern compiler.
  • the pattern compiler may be located on the computer acting as the system controller, or offline, e.g., on a network to which the system controller is connected.
  • the “pattern object file” referred to so far in abstract terms is actually this object metafile.
  • the object metafile will be named the same as the pattern source file, with the source file extension replaced by the object file extension.
  • the OFM will provide an application programming interface (APIs) to read and write this file.
  • the object metafile will have provisions for storing
  • module-specific header information including information identifying the corresponding module and the location of pattern data for the module
  • module-specific pattern data organized as required by the module vendor, and capable of being interpreted by the module vendor.
  • the OFM APIs will allow a module vendor's compiler to write module-specific header information and data into the object metafile. Note that this layout of the object metafile allows the pattern data to be organized on a per-module basis, even in the case where two or more modules in the targeted site are identical.
  • Each module vendor will be responsible for providing its own pattern loading mechanism 615 , following the general procedure.
  • the pattern object metafile 612 of a module 608 stores module-specific data in different sections 616 .
  • the vendor implementation will use the OFM APIs for accessing the relevant module-specific sections from the pattern object metafile.
  • the tester framework will be responsible for calling each module's load method in turn to load module-specific data to a module from the appropriate section of the metafile.
  • the pattern file will be organized as follows: file_contents : version_info pattern_definitions version_info : Version version-identifier ‘;’ pattern_definitions pattern_definition pattern_definitions pattern_definition pattern_definition : main_header ‘ ⁇ ’ main_section ‘ ⁇ ’ main_header ‘ ⁇ ’main_section vendor_sections ‘ ⁇ ’ subr_header ‘ ⁇ ’ subr_section ‘ ⁇ ’ subr_header ‘ ⁇ ’ subr_section vendor _sections ‘ ⁇ ’ main_header : MainPattern identifier main_section : CommonSection ‘ ⁇ ’ common_contents main_section_domains ‘ ⁇ ’ common_contents : timing_reference timing _map_reference timing_reference : Timing file-name ‘;’ timing_map_reference : TimingMap file-name ‘;’ main_section_domains : main_section _domains main_section_domain main_section_domain main_section_domain : Domain domain_name ‘ ⁇ ’ main
  • version-identifier A sequence of one or more characters from the set [0-9.], where the first character must be a digit.
  • vendor-section-contents Arbitrary text that is meaningful only to a vendor-specific compiler.
  • file-name A valid Windows file name (must be enclosed in double quotes if any white-spaces are contained in the file name). Note that this should be a simple file name, i.e., it should not have a directory component.
  • waveform-table-pin-group-name A sequence of one or more characters from the set [a-zA-Z — 0-9], where the first character must be from the set [a-zA-Z_]. This variable is declared elsewhere and holds the name of the waveform-table that is common to a group of pins.
  • 8-bit number A valid decimal number up to a maximum of 256.
  • index-register A valid decimal number. In one embodiment of a module this can have a value [1-8].
  • vector This is similar to the Vector statement in STIL. Note that this refers to signal names and signal groups names, making it necessary for the compiler to have access to the Pin Description file.
  • waveform-time-reference A sequence of one or more characters from the set [a-zA-Z — 0-9], where the first character must be from the set [a-zA-Z_].
  • Pattern files will support comments, which are meant to be ignored by a pattern file compiler. Comments will start with the ‘#’ character, and extend to the end of the line.
  • the pattern-name item specifies the name that will be associated with the Pattern object that the pattern file contains the data for. This gets carried over to the header in the corresponding pattern object metafile.
  • the waveform-time-reference is the name for a particular waveform-and-timing definition that would be defined externally to the pattern file, in the Timing file.
  • the specification of a waveform-time-reference in the pattern file would bind that particular name (for a waveform-and-timing) to all subsequent vectors, until another waveform-time-reference were encountered.
  • the operand for a subroutine call (e.g., JSR and JSRC) is a string that should either be a pattern-spec label previously encountered in the same pattern file, or a pattern-spec label in an externally defined subroutine pattern. This operand will ultimately be resolved for the purposes of loading/handling subroutines.
  • the labels for subroutine call operands are required to be unique across the system.
  • waveform-time-reference names could be anything that is syntactically correct, due to specific hardware implications the waveform-time-reference names may need to be restricted to a previously known, well-defined set (which, for added readability, can be optionally mapped by the user to user-chosen names, the mapping presented in an optional file).
  • pattern and waveform-time-reference source files should provide initial configuration data for all DUT channels which have connections to physical tester channels. If subsequent data is omitted for any DUT channel, the pattern compiler will “pad” the pattern data to hold output from the initial level.
  • Summary information from the main header and common section in the pattern source file is stored in the main header in the object metafile.
  • the summary consists of information that is typically required for quick extraction to aid pre-load resolution of addresses, etc., or to aid in datalogging. Since the semantics of the common section are exactly the same for all compilers, every compiler will be capable of providing the same summary information, and the first compiler writing the metafile will store this information. The following is the information that will be stored:
  • the open architecture test system requires both pattern and pattern list files to have explicit, and different, extensions. For pattern files, this applies to both plain text source and compiled object files. This is viewed as a convenience to the user to quickly identify the file type visually in a directory listing, etc., as well as allow associations to be made on the basis of extensions.
  • the pattern list file parser will expect filenames with these extensions: Plain text pattern source file: .pat Compiled pattern object metafile: .pobj Pattern list file: .plst
  • the user can override these default values, e.g., through tester environment variables or setup options.
  • Tester_PATLIST_PATH For pattern list files.
  • Tester_PATSRC_PATH For pattern source files (optional).
  • Tester_PATOBJ_PATH For pattern object metafiles.
  • Tester_PATSRC_PATH is not defined, it will be assumed to be the same as Tester_PATOBJ_PATH. In general, it would be more efficient to not define Tester_PATSRC_PATH rather than define it with the same value as Tester_PATOBJ_PATH.
  • a Pattern object is not created by the user; rather, the user always deals with Pattern List objects, which are collections of other pattern lists and/or patterns.
  • a Pattern List object creates, owns and maintains the pattern objects contained within it, while making them accessible to the user.
  • a pattern list object in the user's test program is associated with a pattern list file on disk, which contains the actual definition of the pattern list. The definition of a pattern list provides an explicit name for the pattern list, and identifies an ordered list of patterns and/or other pattern lists through file name associations. This section describes the software representation of pattern lists and patterns, as a prelude to understanding how they are manipulated in the tester framework.
  • a single test site in the test system can be associated with multiple top-level pattern lists. However, there is only a single execution context for test plans at any given time. Since a top-level pattern list defines an execution sequence for the patterns referred to (hierarchically) by it, the active execution context is the one corresponding to the currently selected top-level pattern list. Note that this does not imply that only the patterns contained in a single pattern list can be loaded on the hardware at one time; rather, the set of patterns that are required to be loaded on the hardware to make an execution sequence viable must always be a subset of all the currently loaded patterns.
  • FIG. 7 illustrates an embodiment of an ordered pattern tree of the invention, assuming that the pattern list A is the top-level pattern list
  • pattern node For a leaf (pattern node), this will always be a pattern file; for an intermediate (pattern list) node, this could be either “top-level file” (for top-level pattern list definitions) or “embedded in file” (for nested pattern-list definitions).
  • the execution options of a pattern are determined by the effective execution options of its immediate parent, combined with the reference options its immediate parent might have for it.
  • pattern list parser is in the process of creating the pattern tree, certain execution options might require initial storage of values simply as strings, since the context of their use might not be resolved until later.
  • An example of such an option is a “mask” option, which specifies pin mask information: pattern lists are not associated with Socket information, and hence, pin mask options (pin and group names) are stored as strings, to be resolved prior to loading.
  • a change made to the contents of a pattern list file on disk will be propagated through the test system only on a load( ) command being executed on that pattern list (or on any other pattern list that references that one). In other words, the pattern list hierarchy in software will always reflect the one currently loaded on the hardware.
  • the top-level pattern lists associated with a test site (and, by extension, with a test plan for that site) have public (global) scope.
  • the system provides APIs to navigate the pattern tree representing a top-level pattern list so that users can get access to individual nodes and sub-trees.
  • the pattern tree is essential for general pattern management.
  • the starting point for a pattern load sequence is a call to the load( ) method on the pattern tree currently associated with the site or test plan.
  • a pattern tree does not operate in isolation.
  • a fully initialized pattern tree will be used to create the following two framework objects:
  • a top-level pattern list defines a Pattern Execution Sequence for the patterns. It describes how such an execution sequence can be derived from the pattern tree corresponding to that top-level pattern list.
  • the pattern execution sequence corresponding to the pattern tree A shown in FIG. 7 is ⁇ q, s, t, q, r, q, u, u, v ⁇ .
  • the Pattern Execution Sequence is conceptually an ordered list reflecting the execution sequence described through the pattern tree. The framework establishes and maintains any necessary navigation links between pattern tree nodes and corresponding entries in the Pattern Execution Sequence.
  • the Pattern Set which is simply a list of all the unique patterns (including subroutines) in the pattern tree. This is thus the list that will be used to determine the individual patterns that should be loaded on the hardware.
  • the framework establishes and maintains any necessary navigation links between pattern tree nodes and corresponding entries in the Pattern Set.
  • the Pattern Set for the pattern tree of FIG. 7 is (q, s, t, r, u, v) (it is assumed that none of the patterns in pattern list A contain any subroutine calls):
  • each pattern list declaration (preceding its definition) or pattern list/pattern reference entry can be followed by a number of execution options.
  • Pattern list execution options modify the runtime execution of pattern lists.
  • the names (and optional values) for these options will be treated simply as strings by the pattern list file parser of the pattern compiler, to be interpreted by a particular version as appropriate.
  • Tester prescribes a set of options and their interpretations, described below. However, vendors can extend the set of options.
  • the pattern list file parser could read an information file for a particular version. Such an information file could also be used to specify whether a particular version at all supports the specification of execution options.
  • Intrinsic options set on pattern list definitions i.e., in the “local-pattern-list-declaration, global-pattern-list-declaration” productions in the file are, in effect, direct option settings on the corresponding Pattern List object in the user's test program. They thus apply to all references to that pattern list object, and are referred to as object options.
  • the effective option settings for any list/pattern in the collection hierarchy are a combination of the object and reference options encountered along the path from the root of the tree to that list/pattern.
  • the specific combination mechanism e.g., set union, set intersection, or any other conflict resolution algorithm
  • the tester specifies a certain set of pattern list execution options that modify its burst behavior, and that modify its execution sequence.
  • a Burst is the execution of a sequence of patterns directly by the hardware, without any involvement from the software.
  • a Burst Discontinuity is a position in an execution sequence where a prior burst is terminated, and a new burst is started.
  • One of the objectives of the pattern management software is to provide the hardware with the execution sequences that it needs to produce a burst on.
  • a pattern tree yields an execution sequence, which if submitted to the hardware will result in a single burst. This behavior can however be modified by the use of options on the pattern list. Thus, the use of options result can result in burst discontinuities.
  • the framework has all the information necessary to determine, and report if required, breaks in pattern bursts resulting from the combination of execution options specified and the particular execution sequence embodied by the pattern tree. While doing this, it might need to investigate the hardware capabilities of the modules in the system. For example, one hardware implementation allows four stored configurations for pin masks, of which two (0 and 3) are used for default masked (to support Mask This Vector, MTV) and unmasked operation. The user is thus allowed two different global pin-mask configurations without breaking burst mode.
  • Intrinsic i.e. associated with a definition with the Global or Local keyword
  • Referential i.e. associated with a reference with the Pat or PList keyword
  • an option is said to be Inherited by Children if the option is assumed to apply recursively to all statically (syntactically) or dynamically (semantically by being referenced) nested patterns or pattern lists.
  • This pattern list will always have the compare circuits of the pins referred to by the indicated pin or pin group disabled. Sometimes, hardware limitations may result in burst discontinuities.
  • This pattern list will always execute in the non-burst mode. This option is not inherited by children, but the BurstOffDeep option (below) is inherited by children.
  • This pattern list will always execute in the non-burst mode. This option is inherited by children, but the BurstOff option (above) is not inherited by children. Note that the BurstOffDeep option cannot be turned off by a child.
  • the indicated pattern is to be prefixed to all bursts within this pattern list.
  • the PreBurst pattern occurs just before every burst that is started due to this pattern list node.
  • the option is not applied when already within a burst which has a PreBurst option that is the same pattern.
  • the indicated pattern is to be suffixed to all bursts within this pattern list.
  • the PostBurst pattern occurs just after every burst that is started due to this pattern list node. The option is not applied when already within a burst which has a PostBurst option that is the same pattern.
  • the indicated pattern is to prefixed to all patterns within this pattern list.
  • the indicated pattern is to be suffixed to all patterns within this pattern list.
  • the named ALPG object stores relevant information such as slow speed APG register settings, read latency, immediate data registers, address scramble, data inversion, data generators, etc.
  • the pattern list will start executing at the first occurrence of the StartPattern in its execution sequence.
  • the pattern list will stop executing at the first occurrence of the StopPattern in its execution sequence.
  • the pattern list will start executing at the StartAddr in the first occurrence of the StartPattern in its execution sequence.

Abstract

Test program development for a semiconductor test system, such as automated test equipment (ATE), using object-oriented constructs is described. The invention provides a method for describing test system resources, test system configuration, module configuration, test sequence, test plan, test condition, test pattern, and timing information in general-purpose object-oriented constructs, e.g., C++ objects and classes. In particular, the modularity of program development is suitable for developing test programs for an open architecture semiconductor test system.

Description

    CROSS-REFERENCE TO RELATED APPLICATIONS
  • This application claims the benefit of application No. 60/447,839, “Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits,” filed Feb. 14, 2003; application No. 60/449,622, “Method and Apparatus for Testing Integrated Circuits,” filed Feb. 24, 2003; U.S. application Ser. No. 10/404,002, “Test emulator, test module emulator, and record medium storing programs therein,” filed Mar. 31, 2003; and U.S. application Ser. No. 10/403,817, “Test Apparatus and Test Method,” filed Mar. 31, 2003, all of which are incorporated herein in their entirety by reference. This application also incorporates by reference in its entirety U.S. application no. ______, “Method and Apparatus for Testing Integrated Circuits,” filed concurrently herewith, which claims the benefit of application No. 60/449,622, “Method and Apparatus for Testing Integrated Circuits,” filed Feb. 24, 2003.[0001]
  • BACKGROUND OF THE INVENTION
  • 1. Field of Invention [0002]
  • The present invention relates to the testing of integrated circuits (ICs), and more particularly to developing a test program for automated semiconductor test equipment (ATE). [0003]
  • 2. Description of Related Art [0004]
  • Today tester manufacturers use their own proprietary languages to develop test programs for semiconductor test systems (testers). For example, machines produced by Advantest Corporation utilize the Test Description Language (TDL), and Credence Systems offers its own Waveform Generation Language (WGL). To overcome this degree of specialization, IC and tester manufacturers tried to find a common ground by developing IEEE standard 1450, the Standard Test Interface Language (STIL). STIL, however, is a highly specialized language for defining pins, test commands, timing, etc. Moreover, a test engineer running STIL nevertheless still needs to translate STIL into the proprietary manufacturer-specific language required by the tester. Thus STIL merely serves as an intermediate language that is nonetheless highly specialized and not generally known to programmers. [0005]
  • Hence, it is desirable to develop a method through which test program can be written in a general purpose language. Moreover, this method should allow for easy development of test programs for an open architecture test system. [0006]
  • SUMMARY OF THE INVENTION
  • This application describes test program development using object-oriented constructs, e.g., C++ objects and classes. In particular, this method is suitable for developing test programs for an open architecture tester, such as that described in U.S. application Ser. Nos. 60/449,622, 10/404,002 and 10/403,817, assigned to the assignee of the present invention. [0007]
  • An embodiment of the present invention provides a method for developing a test program by describing test system resources, test system configuration, module configuration, test sequence, test plan, test condition, test pattern and timing information in general-purpose object-oriented, e.g., C/C++, constructs to test a device under test, e.g., an IC, on a semiconductor test system, such as automated test equipment (ATE). The files containing these descriptions are stored in memory, i.e., a computer-readable medium, accessible to the test system or related equipment that uses the files. [0008]
  • Describing test system resources may comprise specifying a resource type, where the resource type is associated with at least one test module for applying a test to the IC, specifying a parameter type associated with the resource type, and specifying a parameter of the parameter type. [0009]
  • Describing test system configuration may comprise specifying a site controller for controlling at least one test module, where each test module applies a test to the IC, and specifying an input port of a module connection enabler. The test system couples the site controller to the module connection enabler at the specified input port, and the module connection enabler couples the site controller to a test module. The module connection enabler may be implemented as a switch matrix. [0010]
  • Describing module configuration may comprise specifying a module identifier for specifying a module type, specifying executable code for controlling a test module of the module type specified by the module identifer, and specifying a resource type associated with the test module. The executable code may take the form of a dynamic link library. [0011]
  • Describing module configuration may further involve the user specifying a slot identifier for specifying an output port of the module connection enabler, where the test system couples the test module to the module connection enabler at the output port, and the module connection enabler couples the test module to a corresponding site controller. The user may also specify a vendor identifier for identifying the provider of the test module, and an identifier of the maximum number of resource units available in connection with the resource type. The resource type may be, for example, digital tester pins and the resource units tester channels. Alternatively, the tester channel resource units may also correspond to resource types such as, for example, analog tester pins, RF tester pins, power supply pins, digitizer pins, and arbitrary waveform generation pins. An indicator relating to which resource units are disabled may also be provided. The resource units indicated as disabled may represent defective resource units of the test module. [0012]
  • Describing test conditions may comprise specifying at least one test condition group, specifying a specification set including at least one variable; and specifying a selector for selecting an expression to be bound to a variable. Association of the test condition group with a selector for the specification set defines a test condition. [0013]
  • Describing a test sequence may comprise specifying the order (or flow) in which various tests can be applied. [0014]
  • Describing test patterns may comprise specifying the test patterns, associated voltage and current levels, transitions in signal values, corresponding rise and fall times and associated timing. [0015]
  • An embodiment of the present invention also includes the use of preheader files. A preheader file is compiled to create a header file for a class associated with a test entity. The preheader includes a parameter block for specifying parameters for setting at least one attribute of the test entity, and a template block for specifying source code that is inserted by a compiler into the header file for the test entity class. The header file may be a C++ header file. The test entity may be a test and the test entity class may be a test class, for example. The parameters may relate to pattern lists and test conditions, for example. [0016]
  • A pattern compiler of an embodiment of the invention includes at least one module-specific pattern compiler, and an object file manager for directing each module-specific compiler to compile both a corresponding module-specific section of a pattern source file and a common section of the pattern source file. The common section includes information accessible to all of the module-specific compilers. An output of the compiler includes at least one module-specific pattern data section. Module-specific pattern loaders load into corresponding test modules module-specific pattern data from corresponding module-specific pattern data sections for execution.[0017]
  • BRIEF DESCRIPTION OF THE DRAWINGS
  • FIG. 1 illustrates a conventional tester architecture. [0018]
  • FIG. 2 illustrates a tester architecture according to an embodiment of the present invention. [0019]
  • FIG. 3 illustrates a tester software architecture according to an embodiment of the present invention. [0020]
  • FIG. 4 illustrates a test program compiler according to an embodiment of the present invention. [0021]
  • FIG. 5 illustrates how different test instances may be derived from a single test class according to an embodiment of the present invention. [0022]
  • FIG. 6 illustrates a pattern compiler according to an embodiment of the present invention. [0023]
  • FIG. 7 illustrates a ordered pattern tree example according to an embodiment of the present invention. [0024]
  • FIG. 8 illustrates another ordered pattern tree example according to an embodiment of the present invention. [0025]
  • FIG. 9 illustrates the relationships among files that are required by a test program according to an embodiment of the present invention. [0026]
  • FIG. 10 illustrates waveform generation according to an embodiment of the present invention. [0027]
  • FIG. 11 illustrates a mapping used for timing according to an embodiment of the present invention. [0028]
  • FIG. 12 illustrates another mapping used for timing according to an embodiment of the present invention. [0029]
  • DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS
  • The present invention is generally described in terms of the Open architecture test system as disclosed in U.S. application Ser. Nos. 60/449,622, 10/404,002 and 10/403,817 by the same assignee. Those skilled in the art will recognize, however, that embodiments of the test program development system and method of the present invention are applicable not only to an open tester architecture, but also to fixed tester architectures, as well. [0030]
  • A description of the open architecture test system may be found in U.S. application no. ______, “Method and Apparatus for Testing Integrated Circuits,” filed concurrently herewith, which claims the benefit of U.S. application No. 60/449,622 by the same assignee. [0031]
  • FIG. 1 illustrates a generalized architecture of a conventional tester showing how a signal is generated and applied to a device-under-test (DUT). Each DUT input pin is connected to a [0032] driver 2 that applies test data, while each DUT output pin is connected to a comparator 4. In most cases, tri-state driver-comparators are used so that each tester pin (channel) can act either as an input pin or as an output pin. The tester pins dedicated to a single DUT collectively form a test site that works with an associated timing generator 6, waveform generator 8, pattern memory 10, timing data memory 12, waveform memory data 14, and block 16 that define the data rate.
  • FIG. 2 illustrates a [0033] system architecture 100 according to an embodiment of the present invention. A system controller (SysC) 102 is coupled to multiple site controllers (SiteCs) 104. The system controller may also be coupled to a network to access files. Through a module connection enabler 106, each site controller is coupled to control one or more test modules 108 located at a test site 110. The module connection enabler 106 allows reconfiguration of connected hardware modules 108 and also serves as a bus for data transfer (for loading pattern data, gathering response data, providing control, etc.). Possible hardware implementations include dedicated connections, switch connections, bus connections, ring connections, and star connections. The module connection enabler 106 may be implemented by a switch matrix, for example. Each test site 110 is associated with a DUT 112, which is connected to the modules of the corresponding site through a loadboard 114. In one embodiment, a single site controller may be connected to multiple DUT sites.
  • The [0034] system controller 102 serves as the overall system manager. It coordinates the site controller activities, manages system-level parallel test strategies, and additionally provides for handler/probe controls as well as system-level data-logging and error handling support. Depending on the operational setting, the system controller 102 can be deployed on a CPU that is separate from the operation of site controllers 104. Alternatively a common CPU may be shared by the system controller 102 and the site controllers 104. Similarly, each site controller 104 can be deployed on its own dedicated CPU (central processing unit), or as a separate process or thread within the same CPU.
  • The system architecture can be conceptually envisioned as the distributed system shown in FIG. 2 with the understanding that the individual system components could also be regarded as logical components of an integrated, monolithic system, and not necessarily as physical components of a distributed system. [0035]
  • FIG. 3 illustrates a [0036] software architecture 200 according to an embodiment of the present invention. The software architecture 200 represents a distributed operating system, having elements for the system controller 220, at least one site controller 240, and at least one module 260 in correspondence to related hardware system elements 102, 104, 108. In addition to the module 260, the architecture 200 includes a corresponding element for module emulation 280 in software.
  • As an exemplary choice, the development environment for this platform can be based on Microsoft Windows. The use of this architecture has side benefits in program and support portability (e.g., a field service engineer could connect a laptop which runs the tester operating system to perform advanced diagnostics). However, for large compute-intensive operations (such as test pattern compiles), the relevant software can be made as an independent entity capable of running independently to allow job scheduling across distributed platforms. Related software tools for batch jobs are thus capable of running on multiple platform types. [0037]
  • As an exemplary choice, ANSI/ISO standard C++ can be taken as the native language for the software. Of course, there are a multitude of options available (to provide a layer over the nominal C++ interfaces) that allows a third party to integrate into the system with an alternative language of its own choice. [0038]
  • FIG. 3 illustrates a shading of elements according to their organization by nominal source (or collective development as a sub-system) including the tester operating system, user components [0039] 292 (e.g., supplied by a user for test purposes), system components 294 (e.g., supplied as software infrastructure for basic connectivity and communication), module development components 296 (e.g., supplied by a module developer), and external components 298 (e.g., supplied by external sources other than module developers).
  • From the perspective of source-based organization, the tester operating system (TOS) [0040] interface 290 include: System Controller to Site Controller interfaces 222, framework classes 224, Site Controller to Module interfaces 245, framework classes 246, predetermined module-level interfaces, backplane communications library 249, chassis slot IF (Interface) 262, loadboard hardware IF 264, backplane simulation IF 283, loadboard simulation IF 285, DUT simulation IF 287, Verilog PLI (programming language interface) 288 for DUT's Verilog model and C/C++ language support 289 for DUT's C/C++ model.
  • [0041] User components 292 include: a user test plan 242, user test classes 243, hardware loadboard 265, and DUT 266, a DUT Verilog model 293 and a DUT C/C++ model 291.
  • [0042] System components 294 include: system tools 226, communications library 230, test classes 244, a backplane driver 250, HW backplane 261, simulation framework 281, backplane emulation 282, and loadboard simulation 286.
  • Module-[0043] development components 296 include: module commands implementation 248, module hardware 263, and module emulation 284.
  • [0044] External components 298 include external tools 225.
  • The [0045] system controller 220 includes interfaces 222 to site controller, framework classes 224, system tools 226, external tools 225, and a communications library 230. The System Controller software is the primary point of interaction for the user. It provides the gateway to the Site Controllers of the invention, and synchronization of the Site Controllers in a multi-site/DUT environment as described in U.S. application No. 60/449,622 by the same assignee. User applications and tools, graphical user interface (GUI)-based or otherwise, run on the System Controller. The System Controller also may act as the repository for all Test Plan related information, including Test Plans, test patterns and test parameter files. The memory storing these files may be local to the system controller or offline, e.g., connected to the system controller through a network. A test parameter file contains parameterization data for a Test class in the object oriented environment of an embodiment of the invention.
  • Third party developers can provide tools in addition to (or as replacements for) the [0046] standard system tools 226. The standard interfaces 222 on the System Controller 220 include interfaces that the tools use to access the tester and test objects. The Tools (applications) 225, 226 allow interactive and batch control of the test and tester objects. The tools include applications for providing automation capabilities (through, for example, the use of SECS/TSEM, etc.)
  • The [0047] Communications library 230 residing on the system controller 220 provides the mechanism to communicate with the Site Controllers 240 in a manner that is transparent to user applications and test programs.
  • The [0048] Interfaces 222 resident in memory associated with the System Controller 220 provide open interfaces to the framework objects that execute on the System Controller. Included are interfaces allowing the Site Controller-based module software to access and retrieve pattern data. Also included are interfaces that applications and tools use to access the tester and test objects, as well as scripting interfaces, which provide the ability to access and manipulate the tester and test components through a scripting engine. This allows a common mechanism for interactive, batch and remote applications to perform their functions.
  • The [0049] Framework Classes 224 associated with the System Controller 220 provide a mechanism to interact with these above-mentioned objects, providing a reference implementation of a standard interface. For example, the site controller 240 of the invention provides a functional test object. The system controller framework classes may provide a corresponding functional test proxy as a remote system controller-based surrogate of the functional test object. The standard functional test interface is thus made available to the tools on the system controller 220. The framework classes effectively provide an operating system associated with the host system controller. They also constitute the software elements that provide the gateway to the Site Controllers, and provide synchronization of the Site Controllers in a multi-site/DUT environment. This layer thus provides an object model in an embodiment of the invention that is suitable for manipulating and accessing Site Controllers without needing to deal directly with the Communications layer.
  • The [0050] site controller 240 hosts a user test plan 242, user test classes 243, standard test classes 244, standard interfaces 245, site controller framework classes 246, module high level command interfaces (i.e., predetermined module-level interfaces 247, module commands implementation 248, backplane communications library 249, and a backplane driver 250. Preferably most of the testing functionality is handled by the site controllers 104/240, thus allowing independent operation of the test sites 110.
  • A [0051] Test Plan 242 is written by the user. The plan may be written directly in a standard computer language employing object-oriented constructs, such as C++, or described in a higher level test programming language to produce C++ code, which can then be compiled into the executable test program. For test program development, one embodiment of the invention employs assignee's inventive Test Program Language (TPL) compiler. Referring to FIG. 4, the test program compiler 400 acts in part as a code generator including a translator section 402 to translate a test program developer's source files 404 describing tests and associated parameters into object-oriented constructs, such as C++ code. A compiler section 406, in turn, compiles and links the code into executables, e.g., DLLs, to create the test program that may be executed by the tester system. Although the application of the TPL code generator/translator to test systems is novel, please note that code generators are known in the art. Also, the compiler section may be a standard C++ compiler known in the art.
  • The test plan creates test objects by using the [0052] Framework Classes 246 and/or standard or user supplied Test Classes 244 associated with the site controllers, configures the hardware using the Standard Interfaces 245, and defines the test plan flow. It also provides any additional logic required during execution of the test plan. The test plan supports some basic services and provides an interface to the services of underlying objects, such as debug services (e.g., break-pointing), and access to underlying framework and standard classes.
  • The source code input to the [0053] test program compiler 400 includes a Test Plan description file that specifies the objects used in a test plan and their relationships to one another. This file is translated to C++ code that is executed on the Site Controller in the form of an implementation of a standard interface, which may be denoted ITestPlan. This code is packaged into a Windows dynamic link library (DLL), which may be loaded onto the Site Controller. The Test Program DLL is generated to have standard known entry points that the Site Controller software can use to generate and return the TestPlan object it contains. The Site Controller software loads the Test Program DLL into its process space and uses one of the entry points to create an instance of the Test Plan object. Once the Test Plan object has been created, the Site Controller software can then execute the test plan.
  • The [0054] Framework classes 246 associated with the site controllers are a set of classes and methods that implement common test-related operations. The site controller-level framework includes, for example, classes for power supply and pin electronics sequencing, setting level and timing conditions, obtaining measurements, and controlling test flow. The framework also provides methods for runtime services and debugging. The framework objects may work through implementing the standard interfaces. For example, the implementation of the TesterPin framework class is standardized to implement a general tester pin interface that test classes may use to interact with hardware module pins.
  • Certain framework objects may be implemented to work with the help of the module-[0055] level interfaces 247 to communicate with the modules. The site controller framework classes effectively act as a local operating system supporting each site controller.
  • In general more than ninety percent of the program code is data for the device test, and the remaining ten percent of the code realizes the test methodology. The device test data is DUT-dependent (e.g., power supply conditions, signal voltage conditions, timing conditions, etc.). The test code consists of methods to load the specified device conditions on to ATE hardware, and also those needed to realize user-specified objectives (such as datalogging). The framework of an embodiment of the invention provide a hardware-independent test and tester object model that allows the user to perform the task of DUT test programming. [0056]
  • To increase the reusability of test code, such code may be made independent of any device-specific data (e.g., pin name, stimulus data, etc.), or device-test-specific data (e.g., conditions for DC units, measurement pins, number of target pins, name of pattern file, addresses of pattern programs). If code for a test is compiled with data of these types, the reusability of the test code would decrease. Therefore, according to an embodiment of the invention, any device-specific data or device-test-specific data may be made available to the test code externally, as inputs during code execution time. [0057]
  • In an embodiment of the invention, a Test Class, which is an implementation of a standard test interface, denoted here as ITest, realizes the separation of test data and code (and hence, the reusability of code) for a particular type of test. Such a test class may be regarded as a “template” for separate instances of itself, which differ from each other only on the basis of device-specific and/or device-test-specific data. Test classes are specified in the test plan file. Each Test class typically implements a specific type of device test or setup for device test. For example, an embodiment of the invention may provide a specific implementation of the ITest interface, for example, FunctionalTest, as the base class for all functional tests for DUTs. It provides the basic functionality of setting test conditions, executing patterns, and determining the status of the test based on the presence of failed strobes. Other types of implementations may include AC and DC test classes, denoted here as ACPararnetricTests and DCParametricTests. [0058]
  • All test types may provide default implementations of some virtual methods (e.g., init( ), preExec( ), and postexec( )). These methods become the test engineer's entry points for overriding default behavior and setting any test-specific parameters. However, custom test classes can also be used in test plans. [0059]
  • Test classes allow the user to configure class behavior by providing parameters that are used to specify the options for a particular instance of that test. For example, a Functional Test may take parameters PList and TestConditionS, to specify the Pattern List to execute, and the Level and Timing conditions for the test, respectively. Specifying different values for these parameters (through the use of different “Test” blocks in a test plan description file) allows the user to create different instances of a Functional Test. FIG. 5 illustrates how different test instances may be derived from a single test class. These classes may be programmed directly in object-oriented constructs, such as C++ code, or designed to allow a test program compiler to take the description of the tests and their parameters from a test plan file and generate corresponding C++ code, which can be compiled and linked to generate the test program. A Template Library may be employed as the general-purpose library of generic algorithms and data structures. This library may be visible to a user of the tester, so that the user may, for example, modify the implementation of a test class to create a user-defined test class. [0060]
  • As to user-developed test classes, an embodiment of the system supports integration of such test classes into the framework in that all test classes derive from a single test interface, e.g., ITest, so that the framework can manipulate them in the same way as the standard set of system test classes. Users are free to incorporate additional functionality into their test classes, with the understanding that they have to use custom code in their test programs to take advantage of these additional facilities. [0061]
  • Each [0062] test site 110 is dedicated to testing one or more DUTs 106, and functions through a configurable collection of test modules 112. Each test module 112 is an entity that performs a particular test task. For example, a test module 112 could be a DUT power supply, a pin card, an analog card, etc. This modular approach provides a high degree of flexibility and configurability.
  • The Module Commands [0063] Implementation classes 248 may be provided by module hardware vendors, and implement either the module-level interfaces for hardware modules, or provide module-specific implementations of standard interfaces, depending on the commands implementation method chosen by a vendor. The external interfaces of these classes are defined by pre-determined module level interface requirements, and backplane communications library requirements. This layer also provides for extension of the standard set of test commands, allowing the addition of methods (functions) and data elements.
  • The [0064] Backplane Communications Library 249 provides the interface for standard communications across the backplane, thereby providing the functions necessary to communicate with the modules connected to the test site. This allows vendor-specific module software to use a Backplane Driver 250 to communicate with the corresponding hardware modules. The backplane communications protocol may use a packet based format.
  • Tester Pin objects represent physical tester channels and derive from a tester pin interface, denoted here as ITesterPin. The software development kit (SDK) of an embodiment of the invention provides a default implementation of ITesterPin, which may be called TesterPin, which is implemented in terms of a predetermined module-level interface, IChannel. Vendors are free to make use of TesterPin if they can implement their module's functionality in terms of IChannel; otherwise, they must provide an implementation of ITesterPin to work with their module. [0065]
  • The standard module interface, denoted here as IModule, provided by the tester system of the invention generically represents a vendor's hardware module. Vendor-supplied module-specific software for the system may be provided in the form of executables such as dynamic link libraries (DLLs). Software for each module-type from a vendor may be encapsulated in a single DLL. Each such software module is responsible for providing vendor-specific implementations for the module interface commands, which comprise the API for module software development. [0066]
  • There are two aspects of the module interface commands: first, they serve as the interface for users to communicate (indirectly) with a particular hardware module in the system, and second, they provide the interfaces that third-party developers can take advantage of to integrate their own modules into the site controller level framework. Thus, the module interface commands provided by the framework are divided into two types: [0067]
  • The first, and most obvious, are those “commands” exposed to the user through the framework interfaces. Thus, a tester pin interface (ITesterPin) provides methods to get and set level and timing values, while a power supply interface (IPowerSupply) provides methods for powering up and powering down, for example. [0068]
  • In addition, the framework provides the special category of the predetermined module-level interfaces, which can be used to communicate with the modules. These are the interfaces used by framework classes (i.e., “standard” implementations of framework interfaces) to communicate with vendor modules. [0069]
  • However, the use of the second aspect, the module-level interfaces, is optional. The advantage of doing so is that vendors may then take advantage of the implementations of classes such as ITesterPin and IPowerSupply, etc. while focusing on the content of specific messages sent to their hardware by implementing the module-level interfaces. If these interfaces are inappropriate to the vendor, however, they may choose to provide their custom implementations of the framework interfaces (e.g., vendor implementations of ITesterPin, IPowerSupply, etc.). These would then provide the custom functionality that is appropriate for their hardware. [0070]
  • With this open architecture as background, the test program development system of the present invention is further described as follows. Section A below describes rules to describe the test environment in which test program will be used; section B describes the method and rules for test program development; section C specifies the method and rules to develop a test plan and how to define the main structure of the test program; section D describes how to run a test program on an open architecture test system; section E describes a method and rules for test patterns; section F describes rules to describe the timing of the test patterns; and section G describes rules for the overall tester operation. [0071]
  • A. Components [0072]
  • The test environment comprises a set of files that specify the necessary conditions for bringing up the tester, and for preparing it to run a set of tests. The test environment preferably includes files for: [0073]
  • 1. Tester Resource definition: for the specification of the types of tester resources—and supported parameters for such resources—that are available in the open architecture test system. [0074]
  • 2. Tester configuration: for the specification of Site Controllers, sites and corresponding mappings. [0075]
  • 3. Module configuration: for specification of the hardware module in each site [0076]
  • 4. Pin descriptions: for naming of DUT pins, such as signal pins, power supplies, and to describe pin groups, [0077]
  • 5. Socket: for the specification of DUT pin-to-tester pin assignments [0078]
  • 6. Pin options: for the specification of special options, or modes, for pins. [0079]
  • 7. Pattern lists: for the specification of test patterns and their sequence. [0080]
  • 8. Patterns: for the specification of test vectors. [0081]
  • Of the above, items 1-3 are created by ICF (installation and configuration files) with information from a CMD (configuration management database), and made available at a well-known location, while items 4-8 are user-specified. This section provides descriptions for the items 1-6 above; items 7-8 are described in more detail in section E. Specific methods and rules are preferably used to develop each of these components; these methods and rules will be described in this section with examples. [0082]
  • A1. The Resource Definition [0083]
  • Each hardware module provides one or more types of hardware resources (resources for short) for use by the test system. The tester Resource Definition is preferably used to declare a set of resource names for the available resource types, and a set of parameter names and types associated with each particular resource type. For instance, the resource name dpin is used to refer to digital tester pins. These resources have parameters such as VIL (for the input low voltage), VIH (for the input high voltage), VOL (for the output low voltage), VOH (for the output high voltage), etc. A resource definition file will have the extension “.rsc”. Shown below is an example resource definition, containing some tester resources: [0084]
    #
    # File Resources.rsc
    #
    Version 0.1.2;
    ResourceDefs
    {
    # digital pins
    dpin
    {
    # Low and High voltages for input pins
    Voltage VIL, VIH;
    # Low and High voltages for output pins
    Voltage VOL, VOH;
    }
    # power supplies
    dps
    {
    #
    # PRE_WAIT specifies the time to wait after voltage
    # reached its final value to start pattern
    # generation. The actual time that the system
    # will wait is a small system specified range:
    # PRE_WAIT−delta <= actual <= PRE_WAIT+delta
    #
    # PRE_WAIT_MIN is a minimum amount to wait after voltage
    # reached its final value to start pattern generation.
    # It is a system specified range:
    # PRE_WAIT_MIN <= actual <=
    PRE_WAIT_MIN+delta
    #
    # POST_WAIT specifies the time to wait after pattern
    # generation ends to shut down the power. The actual
    # time that the system will wait is a small system
    # defined range:
    # POST_WAIT−delta <= actual <= POST_WAIT+delta
    #
    # POST_WAIT_MIN specifies the time to wait after pattern
    # generation ends to shut down the power. The actual
    # time that the system will wait is a small system
    # defined range:
    # POST_WAIT_MIN <= actual <=
    POST_WAIT_MIN+delta
    #
    Time PRE_WAIT;
    Time PRE_WAIT_MIN;
    Time POST_WAIT;
    Time POST_WAIT_MIN;
    # The voltage.
    Voltage VCC;
    }
    }
  • Note that the type of a resource parameter (such as Voltage or Time) is preferably a standard engineering unit. Vendors supplying special purpose resources that prefer the specification of different parameters should provide their own resource definition files. [0085]
  • Structure for the Resource Definition [0086]
  • Given below is a structure for the resource definition file in accordance with a preferred embodiment of the present invention: [0087]
    resource-file:
    version-info resource-defs
    version-info:
    Version version-identifer ;
    resource-defs:
    ResourceDefs { resource-def-list }
    resource-def-list:
    resource-def
    resource-def-list resource-def
    resource-def:
    resource-name { resource-params-decl-list }
    resource-params-decl-list:
    resource-params-decl
    resource-params-decl-list resource-params-decl
    resource-params-decl:
    elementary-type-name resource-param-name-list ;
    resource-param-name-list:
    resource-param-name
    resource-param-name-list , resource-param-name
  • Undefined non-terminals above are specified below: [0088]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number. [0089]
  • 2. resource-name: A sequence of one or more characters from the set [a-zA-Z[0090] 0-9], not starting with a digit. It represents the name of a resource, such as dpin or dps.
  • 3. elementary-type-name: A sequence of one or more characters from the set [a-zA-Z[0091] 0-9], not starting with a digit. It represents the name of an elementary type, such as Voltage (cf.).
  • 4. resource-param-name: A sequence of one or more characters from the set [a-zA-Z[0092] 0-9], not starting with a digit. It represents the name of a resource parameter, such as VIL.
  • A2. Tester Configuration [0093]
  • The The Tester Configuration is a set of rules that is preferably used to list the Site Controllers in a particular system configuration, and the connection of the Site Controllers to the Switch Matrix input ports. In the architecture of an embodiment of the invention, a single Site Controller can be connected to a single switch matrix input port. Thus, in this context, the switch matrix connections serve as implicit identifiers for the Site Controllers in the system (other configurations are possible). The following is an example of a typical tester configuration: [0094]
    #
    # Tester Configuration, Sys.cfg
    #
    Version 1.2.5;
    SysConfig
    {
    #
    # The first field is the hostname of the Site Controller machine;
    # it can be specified as either a dotted-decimal IP address or a
    # domain-qualified hostname.
    #
    # The second field is the switch matrix input port number, which
    # implicitly serves as the identifier for the Site Controller
    # connected to it.
    #
    zeus.olympus.deities.org 2;
    127.0.0.2 4;
    127.0.0.0 1; # SITEC-1
    127.0.0.3 3;
    }
  • The system configuration for a particular test-floor system is part of the system profile, and is made available as the system configuration file Sys.cfg. Note that in one embodiment the Site Controller connected to port [0095] 1 (“127.0.0.0” in the above example) may enjoy special status, in which it alone configures the Switch Matrix. This “special” Site Controller will be referred to as SITEC-1. Also note that the site controller address in this example is an IP address because the site controllers may be connected to the system controller by an internal network. Conversely, the system controller may be connected to an external network to access files, such as pattern data.
  • Structure for the Tester Configuration [0096]
  • Given below is a structure for the system configuration file in accordance with an embodiment of the present invention: [0097]
    system-config-file:
    version-info system-config
    version-info:
    Version version-identifer ;
    system-config:
    SysConfig { site-controller-connection-list }
    site-controller-connection-list:
    site-controller-connection
    site-controller-connection-list site-controller-connection
    site-controller-connection:
    site-controller-hostname input-port ;
    site-controller-hostname:
    ip-address
    domain-qualified-hostname
    ip-address:
    octet . octet . octet . octet
    domain-qualified-hostname:
    name
    domain-qualified-hostname . name
  • Undefined non-terminals above are specified below: [0098]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number. [0099]
  • 2. octet: A nonnegative integer from 0 to 255 (in decimal notation). [0100]
  • 3. name: A sequence of one or more characters from the set [a-zA-Z[0101] 0-9], not starting with a digit. It represents a name segment in a domain-qualified hostname.
  • 4. input-port: A nonnegative integer, in decimal notation. [0102]
  • A3. The Module Configuration [0103]
  • The Module Configuration allows the specification of the physical configuration of the tester, e.g., the physical location and type of each module in a SYSTEM chassis. This is necessitated by the dynamic nature of the tester bus configuration, which allows a mapping of the tester bus address to the physical slot location. This information allows a hardware discovery process that occurs at system boot-up time to validate the [0104] SYSTEM configuration. Each output port of the Switch Matrix defines a physical slot, which is preferably occupied by a single hardware module. Shown below is an example of a module configuration specified in the file Modules.cfg in accordance with an embodiment of the invention:
    #
    # Module Configuration File, Modules.cfg
    #
    Version 0.0.1;
    ModuleConfig
    {
    #
    # A configuration definition which provides information about
    # the module type that is attached to slots 1-12 and 32-48.
    # Note that a module might provide more than
    # a single type of resource.
    #
    Slot 1-12, 32-48 # Switch matrix output ports
    # which use the configuration
    # defined below.
    {
    VendorID 1; # defined vendor code.
    ModuleID 1; # Vendor-defined id code.
    ModuleDriver mod1.dll; # Module software.
    #
    # Resource named dpin specifies channels
    # for digital data. The name dpin is not
    # a keyword. It is simply the name of a hardware
    # resource, and is obtained from the resource
    # definition file.
    #
    Resource dpin
    {
    MaxAvailable32; # Resource units 1 .. 32.
    }
    Resource analog
    {
    MaxAvailable16; # Resource units 1 .. 16.
    Disabled 1-8; # Disabled resources 1 .. 8.
    # So, enabled ones are 9 .. 16.
    }
    }
    #
    # A configuration definition which provides information about
    # the module type that is attached to slots 16-30, 50, and 61-64.
    #
    Slot 16-30, 50, 61-64
    {
    Resource dpin
    {
    MaxAvailable32; # Max available resource
    units.
    Disabled 3, 30-32; # Disabled resources.
    }
    ModuleDriver “module two.dll”;
    VendorID 2;
    ModuleID 2;
    }
    #
    # A configuration definition, which provides information about
    # the module type that is attached to slots 65-66.
    #
    Slot 65-66
    {
    ModuleID 4; # DPS module with 8
    supplies.
    ModuleDriver mod4.dll;
    VendorID 1;
    #
    # Resource type dps specifying resource units for a
    # Device Power Supply
    #
    Resource dps
    {
    MaxAvailable4;
    Disabled 1;
    }
    }
    }
  • As mentioned earlier, in one embodiment a slot refers to connector through which a hardware module can be connected, such as an output port of the switch matrix. Each configuration definition provides information about the module that may be attached to one or more slots. The VendorID specified in a configuration definition is a unique ID associated with a vendor. The ModuleID refers to a type of module provided by this vendor. There may be several instances of the same ModuleID in a tester configuration. The ModuleDriver refers to a vendor supplied DLL to service the module. Finally, the Resource refers to the units serviced by this module, and provides a name for the resource type; the resource name is obtained from the resource definition file. [0105]
  • The above example describes three configuration blocks in a module configuration file. In one implementation, the first configuration block, slots 1-12 and 32-48 are serviced by a module produced by [0106] vendor 1. This vendor provides the module, the identifier “1” to refer to this module type, and the module driver library to control the module. This module can provide two types of resource units, one designated by the resource name “dpin”, with preferably a total number of 32 resource units (i.e., “channels”), all of which are available, and the other designated by the resource name “analog”, with a total number of 16 resource units, of which only 9 through 16 are available. The second and third configuration blocks are specified in a manner similar to the first configuration.
  • Note that the provision for allowing channels to be denoted as “disabled” is to allow for the identification of defective resource units on modules that are still functional otherwise. Note also that a configuration block may have one or more slot identifiers. When a block has more than a single slot identifier, then the identified slots are said to be cloned. [0107]
  • The module configuration file, Modules.cfg, is created as part of the system profile by the ICM (installation configuration management system) (with test-floor-specific information provided by the user), and made available at a well-known location. The ICM is a utility that can be local to the test system, e.g., on the system controller, or reside elsewhere on the network to which the system controller is connected. The ICM manages the CMD (configuration management database), and typically updated on hardware changes to the system configuration. ICM allows the user to configure the system, e.g., site controllers and modules. The CMD is a database that stores the configurations. For actual tester configuration/operation ICM generates the configuration files, e.g., module configuration, and other files, and copies them and associated files, such as particular module DLLs, onto the tester. [0108]
  • Structure for Module Configuration [0109]
  • Below is the module configuration structure in accordance with the preferred embodiment: [0110]
    file-contents:
    version-info module-config-def
    version-info:
    Version version-identifier ;
    module-config-def:
    ModuleConfig { slot-entry-list }
    slot-entry-list:
    slot-entry
    slot-entry-list slot-entry
    slot-entry:
    Slot positive-integer-list { slot-info }
    slot-info:
    required-config-list
    required-config-list:
    required-config
    required-config-list required-config
    required-config:
    VendorID id-code ;
    ModuleID id-code ;
    ModuleDriver file-name ;
    Resource resource-name { max-spec disabled-specopt }
    max-spec:
    MaxAvailable positive-integer ;
    disabled-spec:
    Disabled positive-integer-list ;
    positive-integer-list:
    positive-integer-list-entry
    positive-integer-list, positive-integer-list-entry
    positive-integer-list-entry:
    positive-integer
    positive-integer-number-range
    positive-integer-number-range:
    positive-integer - pos-integer
  • Undefined non-terminals above are described below: [0111]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must be from the set [0-9]. [0112]
  • 2. positive-integer: A sequence of one or more characters from the set [0-9], not starting with a 0. [0113]
  • 3. id-code: A sequence of one or more characters from the set [a-zA-Z[0114] 0-9].
  • 4. resource-name: A sequence of one or more characters from the set [a-zA-Z[0115] 0-9], where the first character must be from the set [a-zA-Z].
  • Comments are supported; comments start with the ‘#’ character, and extend to the end of the line. [0116]
  • A4. Pin Descriptions [0117]
  • The DUT pin descriptions are described using a Pin Descriptions file. The user makes available a description of the DUT pins in a pin description file, which has the extension pin. This plain text file contains, at least the following: a listing of the DUT pin names; and initial definitions of named pin groups, which make use of the defined DUT pin names (“initial” since they can be subsequently modified or added to, etc., programmatically). [0118]
  • The separation of this data specification from the Test Plan description allows general reuse of the DUT pin definitions, and allows the pattern compiler to derive pin names (required for resolving references to pin names used in vector specifications) from the pin description file, without having the process tied to a specific Test Plan. [0119]
  • Shown below is an example pin description file: [0120]
    #
    # Pin description file, myDUT.pin.
    #
    # Note that this implicitly imports the resource
    # configuration file,Resources.rsc.
    #
    Version 1.1.3a;
    PinDescription
    {
    Resource dpin
    {
    A0;
    A1;
    A2;
    A3;
    A4;
    # This syntax expands to the names “ABUS[1]” and
    “ABUS[2]”
    ABUS[1:2];
    A5;
    BBUS[1:8];
    DIR;
    CLK;
    Group Grp1
    {
    DIR, CLK, A0, A1, A2, A3, A4, BBUS[1:4]
    }
    Group Grp2
    {
    A5,
    #
    # The following line will expand to
    #“DIR, A1, A2, A4, A5, BBUS[2] ”:
    #
    Grp1 − CLK − A0 − A3 − BBUS[1] − BBUS[3:4] + A5,
    BBUS[5:8]
    }
    }
    Resource dps
    {
    vcc1;
    vcc2;
    vcc3;
    Group PSG
    {
    vcc1, vcc2
    }
    }
    }
  • resource type blocks, to allow the compiler to correlate pin and pin group definitions with the allowable parameter settings for Levels, etc. [0121]
  • The following points about pin descriptions should be noted: [0122]
  • 1. Pin groups and pins share the same namespace and have global (i.e., Test Plan) scope. One of the consequences of the global scoping of these names is that pins and pin groups cannot use duplicated names, even when declared in different resource blocks. [0123]
  • 2. At least one Resource definition is required in the pin description file. [0124]
  • 3. At least one pin name should be defined in each resource. [0125]
  • 4. Pin and group names are required to be unique within resource boundaries. [0126]
  • 5. The same pin or group name can be defined for two or more resources. However, duplicates within the same resource are ignored. [0127]
  • 6. All pin names and group names that appear in a group definition should have been already defined within that resource. [0128]
  • 7. Group definitions, if given, should have at least one pin name or group name (i.e., a group definition cannot be empty). [0129]
  • 8. A pin group definition can include a reference to a previously-defined pin group. [0130]
  • 9. A pin group definition can include set operations such as addition and subtraction of previously defined pins and/or pin groups. [0131]
  • Structure for the Pin Descriptions [0132]
  • Given below is the structure for the pin descriptions in accordance with the preferred embodiment of the present invention: [0133]
    pin-description-file:
    version-info pin-description
    version-info:
    Version version-identifer ;
    pin-description:
    PinDescription { resource-pins-def-list }
    resource-pins-def-list:
    resource-pins-def
    resource-pins-def-list resource-pins-def
    resource-pins-def:
    Resource resource-name { pin-or-pin-group-def-list }
    pin-or-pin-group-def-list:
    pin-or-pin-group-def
    pin-or-pin-group-def-list pin-or-pin-group-def
    pindef-or-pin-groupdef:
    pin-def ;
    pin-group-def
    pin-def:
    pin-name
    pin-name [ index : index ]
    pin-group-def:
    Group pin-group-name { pin-group-def-item-list }
    pin-group-def-item-list:
    pin-def
    pin-group-def-item-list, pin-def
  • Undefined non-terminals above are specified below: [0134]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number. [0135]
  • 2. resource-name: A sequence of one or more characters from the set [a-zA-Z[0136] 0-9] not starting with a digit. It represents the name of a resource, such as dpin or dps.
  • 3. pin-name: A sequence of one or more characters from the set [a-zA-Z[0137] 0-9] not starting with a digit. It represents the name of a pin A0.
  • 4. pin-group-name: A sequence of one or more characters from the set [a-zA-Z[0138] 0-9] not starting with a digit. It represents the name of a pin group ABUS.
  • 5. index: A nonnegative integer. It represents the lower bound or an upper bound on a group of related pins. [0139]
  • A5. The Socket [0140]
  • The Socket specifies the mapping between DUT pin names and physical tester pin (channel) assignments (the physical tester channel numbers are defined in the module configuration file). Note that different Sockets can be used to support different DUT packages and different load board configurations, etc. For a multi-DUT system, the Socket definitions for DUT/channel assignments can support “cloning” of a basic Socket to multiple sites. However, different Sockets (i.e., different physical mappings for the same logical pins) should respect site module partitions. Thus, in addition to providing DUT pin to tester channel assignments, the socket also effectively defines the site partitioning. A Socket file could thus contain definitions for several individual site sockets. Shown below is a sample socket file defining three DUT sites: [0141]
    Version 1.1.3
    SocketDef
    {
    DUTType Pentium3
    {
    PinDescription dutP3.pin; # The pin description file for
    Pentium3
    DUT
    2 # Uses the full-specification syntax
    {
    SiteController 1; # Switch Matrix input port
    Resource dpin
    {
    #
    # The CLK pin is assigned to resource dpin,
    # slot 2, resource unit (channel) 13.
    #
    CLK 2.13;
    #
    # The DIR pin is assigned to resource dpin,
    # slot 5, resource unit 15.
    DIR 5.15;
    #
    # The following statement will be expanded to
    # BBUS[7] 5.4
    # BBUS[6] 5.5
    # BBUS[5] 5.6
    #
    # So for example, the pin sequence BBUS[7],
    BBUS[6],
    # BBUS[5] is assigned to the same slot 5, and to
    # resource units 4, 5 and 6 respectively.
    #
    BBUS[7:5] 5.[4:6];
    BBUS[1:4] 7.[21:18];
    BBUS[8] 9.16;
    }
    Resource dps
    {
    #
    # The V1 pin is assigned to resource dps,
    # slot 1, resource unit (channel) 1.
    #
    VCC1 1.1;
    #
    # The VCC2 pin is assigned to resource dps,
    # slot 1, resource unit (channel) 2.
    #
    VCC2 1.2;
    }
    } # End DUT 2
    DUT 1 # This is “cloned” from DUT 2 above
    {
    SiteController 1; # Same Site Controller as for DUT 2
    Resource dpin
    {
    SlotOffset 1; # Offset value for slots
    }
    Resource dps
    {
    SlotOffset 10; # Offset value for slots
    }
    #
    # The offset syntax above indicates that the slot/resource
    # unit assignments are “cloned” from the first DUT defined
    # for this DUTType, i.e., DUT 2, with the slots offset by
    # the SlotOffset values.
    #
    # Looking at the definition of dpin resource units for
    # DUT 2, CLK is bound to slot 2. Hence, for the present
    # DUT, CLK is bound to slot 2 + 1 = 3.
    #
    # Some of the new bindings in effect due to the offset
    # assignments are shown in the table below:
    #
    # ---------------------------------------------------
    # Pin Resource RUnit Slot
    # ---------------------------------------------------
    # CLK dpin 13 2 + 1
    = 3
    # DIR dpin 15 5 + 1
    = 6
    # BBUS[8] dpin 16 9 + 1 = 10
    # VCC1 dps 1 1 + 10 = 11
    # VCC2 dps 2 1 + 10 = 11
    #
    } # End DUT 1
    } # End DUTType Pentium3
    DUTType 74LS245
    {
    PinDescription dutLS.pin;
    DUT 3 disabled # This DUT site is disabled, and will be
    ignored
    {
    ...
    }
    } # End DUTType 74LS245
    } # End SocketDef
  • The following points about a Socket file should be noted: [0142]
  • 1. The Socket file uses information from both module configuration file, and the user's pin description files for the given DUT types (see specification for PinDescription in the example above). The module configuration information is made implicitly available to the Socket file compiler. The socket file compiler is a subpart of the pattern compiler that reads and analyzes the socket DUT name to tester channel mapping, and the module configuration and pin description files to set up the mapping of tester pins to DUT pins used by the pattern compiler. [0143]
  • 2. At least one DUT site definition per DUT type is required, and it must use the full-specification syntax, as opposed to the SlotOffset syntax. If more than one DUT site definition is provided for the same DUT type, the first one must use the full-specification syntax. [0144]
  • 3. Each subsequent DUT site definition (for the same DUT type) may use either the full-specification syntax or the SlotOffset syntax, but not both. This allows individual sites to deviate from a standard pattern (due to, for example, inoperative channels). [0145]
  • 4. The bindings derived from the SlotOffset syntax are defined relative to the first site defined for that DUT type (which uses the full-specification syntax). [0146]
  • 5. DUT sites do not need to be declared in the actual physical order. This allows a case where the first (physical) site deviates from the pattern. [0147]
  • 6. The DUT site IDs are required to be unique across the entire Socket (i.e., across all DUT types defined therein). [0148]
  • 7. At least one resource definition is required per DUT site definition. [0149]
  • 8. The site definitions must be used in conjunction with the module configuration to determine if the test configuration is single-site/single-DUT or single-site/multi-DUT. [0150]
  • 9. In all cases, the Socket file should specify a set of DUT channel mappings which are consistent with the pin description file and the module configuration file. [0151]
  • 10. In some cases, it will be desirable to allow the Socket definition to specify that one or more DUT channels are disconnected from the tester (for example, by designating the assigned physical channel as one with the special ID “0.0”). In this case, these DUT channels may be used and referenced in the context of the test program. Operations on such channels will result in system warnings (but not errors.). At load time, pattern data for disconnected channels will be discarded. [0152]
  • Structure for the Socket [0153]
  • Below is the structure for the module configuration in accordance with a preferred embodiment of the present invention: [0154]
    socket-file:
    version-info socket-def
    version-info:
    Version version-identifer ;
    socket-def:
    SocketDef { device-specific-socket-def-list }
    device-specific-socket-def-list:
    device-specific-socket-def
    device-specific-socket-def-list device-specific-socket-def
    device-specific-socket-def:
    DUTType DUT-type-name { pin-description-file dut-info-list }
    pin-description-file:
    PinDesc pin-description-file-name ;
    dut-info-list:
    dut-info
    dut-info-list dut-info
    dut-info:
    DUT dut-id { site-controller-input-port resource-info-list }
    site-controller-input-port:
    SiteController switch-matrix-input-port-number ;
    resource-info-list:
    resource-info
    resource-info-list resource-info
    resource-info:
    Resource resource-name { resource-item-unit-assignment-list }
    resource-item-unit-assignment-list:
    resource-item-unit-assignment
    resource-item-unit-assignment-list resource-item-unit-assignment
    resource-item-unit-assignment:
    resource-item-name slot-number . resource-unit ;
    resource-item-name [ resource-item-index ] slot-number .
    resource-unit-index ;
    resource-item-name [ resource-item-index-range ] \
    slot-number . [ resource-unit-index-range ] ;
    resource-item-index-range:
    resource-item-index : resource-item-index
    resource-unit-index-range:
    resource-unit-index : resource-unit-index
  • Undefined non-terminals above are specified below: [0155]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9a-zA-Z.]. It represents a version number. [0156]
  • 2. DUT-type-name: A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must not be from the set [0-9]. It represents a type of DUT, such as Pentium3. [0157]
  • 3. pin-description-file-name: The simple name of a file, not including its directory name, but including all extensions. The filename is of the syntax recognized by the host operating system, and allows blanks and other characters if enclosed in quotes. [0158]
  • 4. switch-matrix-input-port-number: A nonnegative integer in decimal notation to represent the port number of the input port connected to the Site Controller. [0159]
  • 5. dut-id: A nonnegative integer in decimal notation to identify an instance of a DUT. [0160]
  • 6. resource-name: A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must not be a digit. It represents the name of a resource defined in a resource file. [0161]
  • 7. resource-item-name: A sequence of one or more characters from the set [0-9a-zA-Z.], where the first character must not be a digit. It represents the name of a resource unit, such as a pin or a pin group. [0162]
  • 8. resource-item-index: A nonnegative integer in decimal notation that represents a particular member of a group of resource items. When in the context of a resource-item-index-range it represents the lower or upper bound of a contiguous sequence of resource item group. [0163]
  • 9. resource-unit-index: A nonnegative integer in decimal notation that represents a particular member of a group of resource units (channels). When in the context of a resource-unit-index-range it represents the lower or upper bound of a contiguous sequence of resource unit group. [0164]
  • A6. Pins [0165]
  • Note that in addition to logical pin name to physical channel mappings (as provided by the Socket), several attributes can be used for specifying the tester resources. For example, options might be used to define particular hardware configurations for channels, which may be test-specific, vendor-specific, and/or test system-specific. These will be described using the Pin Mode Options, and made available via a Pin Mode Options file. [0166]
  • A Pin Mode Option definition would support the configuration of special options or modes for a tester channel. This could, for example, be used to select and configure channel multiplexing. It is preferred that the Pin Mode Option only be used as part of a Test Plan initialization flow, since it might require significant channel configuration. The Pin Option syntax supports vendor-defined options. An example is shown below: [0167]
    PinModeOptions
    {
    clock IN double;
    a0 OUT single;
    ...
    };
  • Test Environment Configuration [0168]
  • As pointed out earlier, the resource definition file (Resources.rsc), the system configuration file (Sys.cfg) and the module configuration file (Modules.cfg) are preferably made available at a “well-known” location. This “well-known” location is the directory specified by the value of the system environment variable Tester_ACTIVE_CONFIGS. For example, if the value of Tester_ACTIVE_CONFIGS is the directory F:\Tester_SYS\configs, the system will expect the following files to be present: [0169]
  • F:\Tester_SYS\configs\Resources.rsc [0170]
  • F:\Tester_SYS\configs\Sys.cfg [0171]
  • F:\Tester_SYS\configs\Modules.cfg [0172]
  • During installation, the Installation and Configuration Management system (ICM) residing on the host computer will preferably set the value of Tester_ACTIVE_CONFIGS. Every time the ICM creates a new version of one of the above files, it will place the new version in the location pointed to by Tester_ACTIVE_CONFIGS. Note that in addition to the above three files, other system configuration files such as the simulation configuration file are also placed in the location pointed to by Tester_ACTIVE_CONFIGS [0173]
  • B. Rules for Test Program Development [0174]
  • One of the two principal end-user oriented components of the tester system is the test environment. The other component is the programming facility that the tester makes available for the end user (i.e., test engineer and test class developers). [0175]
  • The principal component of the programming environment is the test plan. The test plan uses test classes (which are different implementations of a test interface denoted Test), which realize the separation of test data and code for particular types of tests. [0176]
  • The plan may be written directly as a C++ test program, or described in a test plan description file, which is processed by a Test Program Generator (translator [0177] 402) to produce object-oriented code, such as C++ code. The generated C++ code can then be compiled into the executable test program. The data required for populating a test class instance, such as levels, timings, etc., are specified by the user in the test plan description file.
  • A test program contains a set of user written files that specify details for running a test on a device. An embodiment of the invention includes sets of rules that permit a user to write these files using C++ constructs. [0178]
  • One of the requirements according to the embodiment of the invention is to follow the modularity of the open architecture test system. A modular development permits users to write individual components dealing with different aspects of the test, and then permits these components to be mixed and matched in various ways to yield a complete test program. A test program in accordance with the preferred embodiment of the present invention comprises a set of files as follows: [0179]
  • files *.usrv for user variables and constants; [0180]
  • files *.spec for specification sets; [0181]
  • files *.lvl for levels; [0182]
  • files *.tim for timings; [0183]
  • files *.tcg for test condition groups; [0184]
  • files *.bdefs for bin definitions; [0185]
  • files *.ph for a pre-header, files for custom functions and test classes. [0186]
  • files *.ctyp for custom types; [0187]
  • files *.cvar for custom variables; and [0188]
  • files *.tpl for test plans. [0189]
  • The file extensions above are a recommended convention facilitating categorization of files. A single test program will preferably comprise a single test plan file, and the files it imports. An “import” refers to other files with data that is either directly referenced by the importer (the file that specifies the import), or is imported by some other file directly referenced by the importer. The test plan file could define globals, flows, and other such objects within it, or it could import this information from other files. These rules allows any of the above components to be either in their own individual files, or directly inlined into a test plan file. Note that the test plan is similar in concept to a C-language main( ) function. [0190]
  • Test Program Features [0191]
  • User Variables and Constants, [0192]
  • Specification Set, [0193]
  • Levels, [0194]
  • Timings, [0195]
  • Test Conditions [0196]
  • Bin Definition [0197]
  • Pre-Headers [0198]
  • Custom Types [0199]
  • Custom Variables [0200]
  • Test Plan [0201]
  • Test program identifiers preferably start with an upper or lower case alphabetical character, and can subsequently have any number of alphabetical, numerical, or underscore (_) characters. It has several keywords which are provided in the description given below. These keywords are visually identified in code in this document using a bold font, such as Version. Keywords are reserved, and preferably not be used as identifiers. There are several special symbols such as {, }, (, ), :, and others which are described below. [0202]
  • Elaboration of Test Objects [0203]
  • An import of a test description file enables the importing file to refer to names of objects made available by the imported file. This allows the importing file to reference the objects named by the imported file. Consider a socket file aaa.soc that imports a pin description file xxx.pin. There could be another bbb.soc file that also imports xxx.pin. However, neither of these imports cause the objects described by xxx.pin to come into existence. They merely reference objects that are already assumed to exist. [0204]
  • The question arises: when do such objects come into existence? This is where the Test Plan file is fundamentally different. In an analogy to C, it would be a file with a main( ) routine in it. An “Import” statement in test plan file will elaborate these objects, that is, cause these objects to come into existence. The test plan mickey.tpl shown below causes the objects in xxx.pin and aaa.soc to be elaborated: [0205]
    # File for Mickey's TestPlan
    Version 3.4.5;
    #
    # These import statements will actually cause the
    # objects to come into existence:
    #
    Import xxx.pin; # Elaborates pin and pin-group objects
    Import aaa.soc; # Elaborates site socket map objects
    # Other imports as necessary
    ...
    Flow Flow 1
    {
    ...
    }
  • An import of xxx.pin in the test plan causes all the pin and pin group objects declared in xxx.pin to be elaborated. This is described as follows: “the file xxx.pin is elaborated”. It is not necessary for a Test Plan to directly import all the files that need to be elaborated. A file x is imported by a file y if either of the two statements below is true: [0206]
  • 1. y has an import statement that names x; or [0207]
  • 2. x is imported by z, and y has an import statement naming z. [0208]
  • When a test program is compiled, it will elaborate all the objects in the files that are imported by the test plan. The set of files imported by a test plan are topologically sorted to yield an order in which the files are elaborated. The set of files imported by a test plan is referred to as the import closure of the test plan. If the import closure of a test plan cannot be topologically sorted, then there must be an imports cycle. Such a situation is erroneous, and will be rejected by the compiler. [0209]
  • User Variables and Constants [0210]
  • Global variables and constants will be defined using the User Variables and Constants. Constants are objects whose value is bound at compile time, and cannot be changed. The maximum integer value, for instance, would be a constant. On the other hand, the expression bound to variables can change at runtime via an API. [0211]
  • Integer, [0212]
  • UnsignedInteger, [0213]
  • Double, [0214]
  • String, [0215]
  • Voltage in Volts (V), [0216]
  • VoltageSlew in Volts per Second (VPS), [0217]
  • Current in Amps (A), [0218]
  • Power in Watts (W), [0219]
  • Time in Seconds (S), [0220]
  • Length in Meters (M), [0221]
  • Frequency in Hertz (Hz), [0222]
  • Resistance in Ohms (Ohms), and [0223]
  • Capacitance in Farads (F). [0224]
  • The types Integer, UnsignedInteger, Double, and String are referred to as Basic Types. The Basic Types have no measurement units. The Elementary Types which are not basic types are a Double, with an associated measurement unit and a scale. The scaling symbols are common engineering scaling symbols: [0225]
  • p (pico) for 10−12, as in pF (pico-farad) [0226]
  • n (nano) for 10−9, as in nS (nano-second) [0227]
  • u (micro) for 10−6, as in uS (micro-second) [0228]
  • m (milli) for 10−3, as in mV (milli-amp) [0229]
  • k (kilo) for 10+3, as in kOhm (kilo-ohm) [0230]
  • M (mega) for 10+6, as in MHz (mega-hertz) [0231]
  • G (giga) for 10+9, as in GHz (giga-hertz) [0232]
  • A separate file with user variables and constants will have the extension .usrv. Below is an example of a file with some global constants. An example of a file with some variables is given later. [0233]
    # --------------------------------------------------------
    # File limits.usrv
    # --------------------------------------------------------
    Version 1.0.0;
    #
    # This UserVars collection declaration declares a set of
    # globally available variables and constants.
    #
    UserVars
    {
    # Some constant Integer globals used in various places.
    Const Integer MaxInteger = 2147483647;
    Const Integer MinInteger = −2147483648;
    # Smallest value such that 1.0 + Epsilon != 1.0
    Const Double Epsilon = 2.2204460492503131e−016;
    # Some important constants related to Double
    Const Double MaxDouble = 1.7976931348623158e+308;
    Const Double MinDouble = − MaxDouble;
    Const Double ZeroPlus = 2.2250738585072014e−308;
    Const Double ZeroMinus = − ZeroPlus;
    }
  • The set of UserVars declared above are considered definitions of the variable on the left of the ‘=’. As a result, a single occurrence of the definition of a variable or constant is preferred, and it should be initialized. [0234]
  • As mentioned earlier, constants should not be changed once they are defined. The expression bound to a constant can involve previously defined constants and literal values. Variables, on the other hand, can be changed via an API. The expression bound to a variable can involve previously defined variables, constants and literal values. [0235]
  • Each variable is bound to an expression object which is maintained at runtime. This provides the capability of changing the expression associated with a variable at runtime, and then re-evaluating all the variables. The expression object is a parsed form of the right hand side of a variable or constant definition. In one embodiment, no facility is provided for the changing of constants at runtime. Their value is preferably fixed at compile time. [0236]
  • Any number of such files with globals can exist in the import closure of a test plan. While the above globals file is a set of numeric limits, here is a set of engineering globals using engineering measurement units, and some random user variables: [0237]
    # -----------------------------------------------
    # File myvars.usrv
    # -----------------------------------------------
    Version 0.1;
    #
    # This declares a UserVars collection of some engineering
    # globals.
    #
    UserVars MyVars
    {
    # Engineering quantities.
    Const Voltage VInLow = 0.0; # 0 Volts
    Const Voltage VInHigh = 5.0; # 5 Volts
    Const Voltage VOutLow = 400.0 mV; # 400 milliVolts
    Const Voltage VOutHigh = 5.1; # 5.1 Volts
    Const Time DeltaT = 2.0E−9; # 2 nanoseconds
    Const Time ClkTick = 1.0ns; # 1 nanosecond
    Const Resistance R10 = 10.0 kOhms; # 10 kilo Ohms
    # Some variables are declared below.
    Current ILow = 1.0 mA; # 1 milliAmp
    Current IHigh = 2.0 mA; # 2 milliAmp
    Power PLow = ILow * VInLow; # Low power value
    Power PHigh = IHigh * VInHigh; # High power value
    #
    # An array of low values for all A bus pins.
    # The vil for A0 will be in ABusVil[0], for A1
    # in ABusVil[1], and so on.
    #
    Voltage ABusVil[8] = {1.0, 1.2, Others = 1.5};
    }
  • The compiler preferably checks that units and types match up. Note that since a Voltage times a Current yields a Power, the equations for PLow and PHigh above will compile. However, a statement such as the following will typically not compile: [0238]
    #
    # Does not compile because a Current and a Voltage cannot be added
    # to yield a Power.
    #
    Power Pxxx = IHigh + VInHigh;
  • The compiler will allow certain automatic type conversions: [0239]
    Power Pxxx = 2; # Set the power to 2.0 watts
    Integer Y = 3.6; # Y gets assigned 3
    Power Pyyy = Y; # Pyyy gets assigned 3.0 watts
    Doubl Z = Pyyy; # Pyyy gets converted to a unitless Double
  • Explict type conversion to Double, UnsignedInteger and Integer is also permitted: [0240]
    Power Pxxx = 3.5;
    # Explicit type conversion is allowed, but not required
    # X becomes 3.5
    Double X = Double(Pxxx); # X becomes 3.5
    Integer Y = Integer(Pxxx); # Y becomes 3
  • Conversion between unrelated types is also possible, by converting to an intermediate basic type: [0241]
    Power Pxxx = 3.5;
    # Explicit type conversion is required.
    Length L = Double(Pxxx); # L becomes 3.5 meters
    Voltage V = Integer(Pxxx); # V becomes 3.0 Volts.
  • The TestPlan object provides a UserVars class which is a collection that contains names and their associated expressions, values, and types. User variables can go into a Default User Variables Collection, or into a Named User Variables Collection. The UserVars declarations in the example above, which have no specified name, go into the default collection. However, it is possible to explicitly name a collection as follows: [0242]
    # Declare X and Y in the MyVars UserVars collection.
    UserVars MyVars
    {
    Integer X = 2.0;
    #
    # Refers to the above X, and to the globally
    # available MaxInteger from the default
    # UserVars collection.
    #
    Integer Y = MaxInteger − X;
    }
    # Declare X, Y1 and Y2 in the YourVars UserVars collection.
    UserVars YourVars
    {
    Integer X = 3.0;
    # Refers to the X from MyVars.
    Integer Y1 = MaxInteger − MyVars.X;
    # Refers to the X declared above.
    Integer Y2 = MaxInteger − X;
    }
    # More variables being added to the MyVars collection
    UserVars MyVars
    {
    #
    # Refers to X and Y from the earlier declaration
    # of MyVars.
    #
    Integer Z = X + Y;
    }
  • Name resolution within a UserVars collection proceeds as follows: [0243]
  • If a name is qualified—i.e., a name comprises two segments separated by a dot—then the variable comes from a named user variables collection, named by the segment that precedes the dot. So, MyVars.X above refers to the X in the MyVars collection. The name “_UserVars” can be used to explicitly denote the default user variables collection. [0244]
  • If the name is not qualified, and there is a constant or variable of the same name in the present collection, then the name resolves to that constant or variable. [0245]
  • Otherwise, the name resolves to a constant or variable in the default user variables collection. [0246]
  • Evaluation of a block of definitions in a UserVars collection can be thought of happening sequentially, from the first definition to the last. This may require each variable being defined before it is used. [0247]
  • Furthermore, there could be several blocks of definitions for a UserVars collection, each of which are defining several variables. All of these blocks of definitions can be thought of as being evaluated in declaration order in the test plan, and then the variables of each block are also checked in declaration order. [0248]
  • Finally, there could be several UserVars collections, each of which define variables over several blocks of definitions. All of the variables again can be thought of as being initialized in declaration order. Thus, in the above example, the evaluation order would be: MyVars.X, MyVars.Y, YourVars.X, YourVars.Y1, YourVars.Y2, MyVars.Z. [0249]
  • When a UserVars collection uses a variable from another collection, it preferably uses just the raw value of the variable. No dependency information is maintained between collections. Thus, dependency based re-evaluation can be limited to a single collection. [0250]
  • Each user variables collection refers to an instance of a C++ UserVars class. The default object of the C++ UserVars class is named “_UserVars”. Variables in an UserVars declaration that is unnamed are from the default user variables collection, and are added to this default object. Variables in a named user variables collection are added to an object of the C++ UserVars class having that name. In the above example, the “MyVars” C++ object will end up having the variables X, Y and Z. [0251]
  • C++ for User Variables [0252]
  • User variables are implemented as a collection of n-tuples having the name string, a const/var boolean, the type as an enumerated value and the expression as an expression tree. The expression of a name can be set by a call: [0253]
    enum ElemenaryType {UnsignedIntegerT, IntegerT,
    DoubleT, VoltageT, ...};
    Status setExpression(const String& name,
    const bool isConst,
    const elementaryType,
    const Expression& expression);
  • The type Expression is a type that is a parsed form of the text corresponding to the right hand side of an assignment. There will be a globally available instance of UserVars. For example, the set of user variables in limits.usrv (cf. page) is implemented by the set of calls shown below: [0254]
    _UserVars.setExpression(“MaxInteger”, true, IntegerT,
    Expression(2147483647));
    _UserVars.setExpression(“MinInteger”, true, IntegerT,
    Expression(−2147483648));
    _UserVars.setExpression(“Epsilon”, true, DoubleT,
    Expression(2.2204460492503131e−016));
    _UserVars.setExpression(“MaxDouble”, true, DoubleT,
    Expression(1.7976931348623158e+308));
    _UserVars.setExpression(“MinDouble”, true, DoubleT,
    Expression(“− MaxDouble”));
    _UserVars.setExpression(“ZeroPlus”, true, DoubleT,
    Expression(2.2250738585072014e−308));
    _UserVars.setExpression(“ZeroMinus”, true, DoubleT,
    Expression(“− ZeroPlus”));
  • Below are the C++ statements that would be executed for the variables declared in myvars.usrv: [0255]
    myVars.setExpression(“VInLow”, true, VoltageT,
    Expression(0.0));
    myVars.setExpression(“VInHigh”, true, VoltageT,
    Expression(5.0));
    myVars.setExpression(“DeltaT”, true, TimeT,
    Expression(2.0E−9));
    myVars.setExpression(“ClkTick”, true, TimeT,
    Expression(1.0E−9));
    myVars.setExpression(“R10”, true, ResistanceT,
    Expression(10.0E+3));
    myVars.setExpression(“ILow”, false, CurrentT,
    Expression(1.0E−3));
    myVars.setExpression(“IHigh”, false, CurrentT,
    Expression(2.0E−3));
    myVars.setExpression(“PLow”, false, PowerT,
    Expression(“ILow * VInLow”));
    myVars.setExpression(“PHigh”, false, PowerT,
    Expression(“IHigh * VInHigh”));
    myVars.setExpression(“ABusVil[0]”, false, VoltageT,
    Expression(1.0));
    myVars.setExpression(“ABusVil[1]”, false, VoltageT,
    Expression(1.2));
    myVars.setExpression(“ABusVil[2]”, false, VoltageT,
    Expression(1.5));
    myVars.setExpression(“ABusVil[3]”, false, VoltageT,
    Expression(1.5));
    myVars.setExpression(“ABusVil[4]”, false, VoltageT,
    Expression(1.5));
    myVars.setExpression(“ABusVil[5]”, false, VoltageT,
    Expression(1.5));
    myVars.setExpression(“ABusVil[6]”, false, VoltageT,
    Expression(1.5));
    myVars.setExpression(“ABusVil[7]”, false, VoltageT,
    Expression(1.5));
  • In the code above, the Expression class preferably has constructors that represent the parsed form of the expression. Expression has several constructors, including one that takes a string literal and parses it, and another that takes a string literal to use just as a string literal. These are distinguished by additional parameters which are not specified above for the sake of readability. [0256]
  • User variables in the default user variables collection will be managed by the _UserVars object of class UserVars. User variables in a named user variables collection Xxx will be managed by a UserVars object named Xxx. [0257]
  • Runtime API for UserVars [0258]
  • The C++ UserVars class that contains these names and expressions exports an application programming interface (API) to evaluate and modify these values at runtime. Modification of the expressions associated with UserVars also addresses the issue of when the UserVars will be reevaluated, and what the impact of the evaluation will be. [0259]
  • Consider first the issue of when the re-evaluation of UserVars as a result of a change should be triggered. If it is triggered immediately upon making a change to the expression, then the user would not be able to make a series of related changes prior to triggering the reevaluation. Consequently, re-evalutation is triggered by an explicit call by the user. [0260]
  • The impact of reevaluation can be considered next. There are three kinds of re-evaluation that are available in accordance with the preferred embodiment: [0261]
  • UserVars Collection Re-evaluation is reevaluation limited to a single UserVars collection. The semantics of this operation is to re-evaluate all the variables of this collection once again. [0262]
  • UserVars Targeted Re-evaluation is reevaluation limited to a change to the expression bound to a single name. This would enable the user to change the expression of a single name, and cause the re-evaluation of the collection to take place, taking into consideration only this particular change. [0263]
  • User Vars Global Re-evaluation is re-evaluation of all UserVars collections. This basically triggers a re-evaluation of all the UserVars collections in declaration order and is quite costly. [0264]
  • All of the above re-evaluations will re-evaluate dependent objects such as Levels, Timings, etc. after reevaluating the UserVars. Dependent objects will have a dirty bit that represents that it needs re-evaluation. Any time a UserVars collection is programmatically changed, it will also set the dirty bit on all dependent objects. This will trigger re-evaluation of the dependent objects. [0265]
  • In summary, named UserVars collections help contain the re-evaluation impact problem. Re-evaluation is normally limited to a single collection. A simple way of using UserVars would be to only use the default UserVars collection. That way, the ripple effect of making a change can happen to all UserVars. This ripple effect can be limited by having several named UserVars collections. [0266]
  • Multiple collections can refer to variables from one another, but the values bound to the variables are bound at time of use. No dependency is maintained between UserVars collections. [0267]
  • For each elementary type Xxx (UnsignedInteger, Current, Voltage, etc.), a method to get the value: [0268]
  • Status getXxxValue(const String& name, Xxx& value) const; [0269]
  • Note that there is no method to directly set a value, it is done through the call to set the expression, followed by a call to reevaluateCollection( ). [0270]
  • Methods to get and set the expression. The setExpression( ) call can also be used to define a new variable which was not hitherto defined. [0271]
    enum elementaryType
    {
    UnsignedIntegerT, IntegerT, DoubleT, VoltageT, ...
    };
    Status getExpression(const String& name,
    Expression& expression) const;
    Status setExpression(const String& name,
    const bool isConst,
    const elementaryType,
    const Expression& expression);
  • The setExpression( ) call can fail if the expression results in a circular dependency. For instance if the following two calls were made, the second call would fail with a circular dependency failure [0272]
  • setExpression(“X”, true, IntegerT, Expression(“Y+1”)); [0273]
  • setExpression(“Y”, true, IntegerT, Expression(“X+1”)); [0274]
  • This is because the values bound to names are equations and are not assignments. When the value of a variable is changed, a method is provided to reevaluate all the directly and indirectly dependent names. Equations such as the above pair result in a circular dependency which is not permitted. [0275]
  • Note that this API does not typically support unsolicited re-evaluation. A call to setExpression( ) may not automatically cause the variable, and all other variables that depend on it, to be re-evaluated. The values bound to all variables will stay unchanged until a call to reevaluateCollection( ) (below) occurs. [0276]
  • A method to determine if a particular name is a constant: [0277]
  • Status getIsConst(const String& name, bool& isConst); [0278]
  • A method to get the type: [0279]
    enum ElementaryType
    {
    UnsignedIntegerT, IntegerT, DoubleT, VoltageT, ...
    };
    Status getType(const String& name,
    ElementaryType& elementaryType) const;
  • The UserVars Collection Re-evaluation method. [0280]
  • Status reevaluateCollection( ); [0281]
  • The class will maintain equations related to all the variables, and their dependencies. When this method is called, all of the variables will get re-evaluated. [0282]
  • The UserVars Targeted Re-evaluation method. [0283]
  • Status reevaluateTargeted(const String& var); [0284]
  • The class will maintain equations related to all the variables, and their dependencies. When this method is called, the named variable, and all of its dependents will get re-evaluated. [0285]
  • The UserVars Global Re-Evaluation Method. [0286]
  • static Status reevaluateAllCollections( ); [0287]
  • The class will maintain equations related to all the variables, and their dependencies. When this method is called, reevaluateCollection( ) is called on all UserVars collections in an unspecified order. [0288]
  • A method to determine if a particular name is defined: [0289]
  • Status getIsDefined(const String& name, bool& isDefined)const; [0290]
  • A method to determine all the user variables currently defined: [0291]
  • Status getNames(StringList& names)const; [0292]
  • A method to delete a presently defined variable: [0293]
  • Status deleteName(const String& name); [0294]
  • This operation will fail if the name is used in expressions involving other variables. [0295]
  • A method to get the list of variables and constants that depend on a given variable or constant: [0296]
  • Status getDependents(const String& name, StringList& dependents); [0297]
  • Specification Sets [0298]
  • The Specification Set is used to supply a collection of variables which can take on values based on a Selector. For example, consider the following Specification Set that uses selectors Minnie, Mickey, Goofy and Daisy: [0299]
    # ---------------------------------------------------------
    # File Aaa.spec
    # ---------------------------------------------------------
    Version 1.0;
    Import Limits.usrv;
    SpecificationSet Aaa(Minnie, Mickey, Goofy, Daisy)
    {
    Double xxx = 1.0, 2.0, 3.0, 4.0;
    Integer yyy = 10, 20, 30, 40;
    Integer zzz = MaxInteger − xxx,
    MaxInteger − xxx − 1,
    MaxInteger − xxx − 2,
    MaxInteger − xxx;
    # The following declaration associates a single
    # value, which will be chosen regardless of the
    # selector. It is equivalent to:
    # Integer www = yyy + zzz, yyy + zzz, yyy + zzz, yyy + zzz
    Integer www = yyy + zzz;
    }
  • The above Specification Set with the selector Goofy will make the following associations: [0300]
  • xxx=3.0; [0301]
  • yyy=30; [0302]
  • zzz=MaxInteger−xxx−2; [0303]
  • www=yyy+zzz; [0304]
  • The operation of setting the selector on a specification set will be discussed later, when Tests are described. [0305]
  • Syntactically, a specification set a is list of selectors (Minnie, Mickey, Goofy and Daisy in the example above), along with a list of variable definitions (xxx, yyy, zzz and www in the example above). The definition of a variable involves a list of expressions that is either as long as the list of selectors, or comprises a single expression. [0306]
  • Conceptually a specification set can be thought of as a matrix of expressions, whose columns are the Selectors, whose rows are the variables and whose entries are expressions. A particular selector (column) binds each variable (row) to a specific expression (entry). If the list has a single expression, it represents a row with the expression replicated as many times as there are selectors. [0307]
  • Specification sets can appear in two separate contexts. They could be separately declared in a .spec file, in which case they appear as shown above. These are named specification sets. Otherwise, local specification sets can be declared within a Test Condition Group. In such a declaration, the specification set will not be provided with a name. It will be a local specification set, of significance only to the enclosing test condition group. [0308]
  • Named specification sets can be modeled after the named user variables collection. The above specification set can be modeled as a UserVars collection named Aaa, which will have expressions for xxx[Minnie], xxx[Mickey], xxx[Goofy], xxx[Daisy], yyy[Minnie], and so on. When a particular selector (say Mickey) is chosen in the context of a test, the values of xxx, yyy and zzz are obtained from the variable name and the specification set name. [0309]
  • A test condition group can have at most one specification set, which is either a local specification set, or a reference to a named specification set. Local specification sets appear only in the context of a test condition group, and have no explicitly specified name. Such a specification set has an implicit name that is defined by the name of the enclosing test condition group. To resolve a name in a test condition group at a point where several specification sets and several UserVars collections are visible, the following rules are applied: [0310]
  • 1. If the name is qualified, it must be resolved in a named user variables collection. [0311]
  • 2. If the name is not qualified, the name is resolved in either a local specification set, if it is declared in the test condition group, or in the named specification set, if one is referenced in the test condition group. [0312]
  • 3. If the name is not resolved by the earlier rules, it is resolved in the default user variables collection. [0313]
  • To illustrate these rules, consider the following example using Test Conditions Groups (to be described later) [0314]
    Version 1.2.3;
    Import limits.usrv; # Picks up the limits UserVars file above.
    Import aaa.spec; # Picks up the Specification Set AAA above.
    TestConditionGroup TCG1
    {
    SpecificationSet(Min, Max, Typ)
    {
    vcc = 4.9, 5.1, 5.0;
    }
    # Rule 1: Resolution in a named user variables collection.
    # A reference to MyVars.VInLow refers to VInLow from MyVars.
    # Rule 2: Resolution in a local specification set.
    # A reference to “vcc” here will resolve in the context
    # of the local specification set above.
    # Rule 3: Resolution in default user variables collection.
    # A reference to “MaxInteger” here will resolve to limits.usrv.
    # Error: Resolution of xxx
    # A reference to xxx does not resolve because it is neither in
    # the local specification set, nor in limits.usrv.
    # Error: Resolution of Aaa.xxx
    # Looks for a named UserVars collection named Aaa. The named
    # specification set does not qualify.
    }
    TestConditionGroup TCG2
    {
    SpecificationSet Aaa; # References the imported specification set
    # Rule 1: Resolution in a named user variables collection.
    # A reference to MyVars.VInLow refers to VInLow from MyVars.
    # Rule 2: Resolution in a named specification set.
    # A reference to “xxx” here will resolve in the context
    # of the local specification set Aaa above.
    # Rule 3: Resolution in default user variables collection.
    # A reference to “MaxInteger” here will resolve to limits.usrv.
    # Error: Resolution of vcc
    # A reference to vcc does not resolve because it is neither in
    # the named specification set Aaa, nor in limits.usrv.
    # Error: Resolution of Aaa.xxx
    # Looks for a named UserVars collection named Aaa. The named
    # specification set does not qualify.
    }
  • Resolution of a name in a specification set (rule above) requires that a selector of the set be enabled at the time the name resolution is required. This will be enforced by the fact that the test condition group will be referenced in a Test by specifying a selector. [0315]
  • C++ for Specification Sets [0316]
  • Using the above rules, Specification sets can be implemented by the C++ SpecificationSet class. The SpecificationSet class has essentially the same API as the UserVars class, except for an extra String parameter for the selector. Consequently, this API is not described in detail. [0317]
  • All named specification sets are preferably associated with a C++ object of that name. A local specification set in the context of a test condition group will have a name that is unique to that test condition group. It is illegal to refer to a variable of a local specification set outside the context of the test condition group that it is defined in. [0318]
  • Levels [0319]
  • The Levels are used to specify parameters of pins and pin groups. It is a collection of declarations of the form: [0320]
    <pin-or-pin-group-name>
    {
    <pin-param-1> = xxx;
    <pin-param-2> = yyy;
    ...
    }
  • Such a declaration specifies the setting of the various parameters of the named pin or pin-group. For example, such a statement could be used to set the VIL values for all pins in the InputPins group, as shown in the example below: [0321]
    # ---------------------------------------------------------
    # File pentiumlevels.1vl
    # ---------------------------------------------------------
    Version 1.0;
    Import pentium3resources.rsc;
    Import pentium3pins.pin;
    Levels Pentium3Levels
    {
    #
    # Specifies pin-parameters for various pins and
    # pin groups using globals and values from
    # the specification set.
    #
    # The order of specification is significant.
    # Pin parameters will be set in order from
    # first to last in this Levels section, and
    # from first to last for each pin or pin-group
    # subsection.
    #
    # From the imported pin description file pentium3pins.pin,
    # the InPins group is in the “dpin” resource. From the
    # imported resource definition file pentium3resources.rsc,
    # the “dps” resource has parameters named VIL and VIH.
    #
    InPins { VIL = v_il; VIH = v_ih + 1.0; }
    # The following statement requires a delay of 10 uS after
    # the call to set the InPins levels. Actual delay will be
    # a small system defined range around 10.0E−6.
    # 10.0E−6 − delta <= actual <= 10.0E−6 + delta
    Delay 10.0E−6;
    #
    # For the OutPins, the levels for the parameters
    # VOL and VOH are specified.
    #
    OutPins { VOL = v_ol / 2.0; VOH = v_oh; }
    # The clock pin will have special values.
    Clock { VOL = 0.0; VOH = v_ih / 2.0; }
    # A Delay of 10 uS after the call to set Clock levels.
    # This is a minimum delay, that is guaranteed to be for
    # at least 10.0 uS, though it may be a little more:
    # 10.0E−6 <= actual <= 10.0E−6 + delta
    MinDelay 10.0 uS;
    #
    # The PowerPins group is in the “dps” resource. Pins of this
    # pin group have special parameters:
    # PRE_WAIT specifies the time to wait after voltage
    # reached its final value to start pattern
    # generation. Actual wait time will be a small
    # system defined range around PRE_WAIT (see)
    # POST_WAIT specifies the time to wait after pattern
    # generation ends to shut down the power. Actual
    # wait time will be a small system defined range
    # around PRE_WAIT (see).
    #
    PowerPins
    {
    PRE_WAIT = 10.0 ms;
    POST_WAIT = 10.0 ms;
    # VCC reaches its final value of 2.0 V from its
    # present value in a ramp with a Voltage Slew Rate
    # of ±.01 Volts per Second.
    VCC = Slew(0.01, 2.0 V);
    }
    }
    Levels Pentium4Levels
    {
    # ...
    }
  • As seen above, each Levels block is preferably made up of a number of levels items, each of which specifies parameters for a pin or pin group. Each levels item can specify a number of resource parameters. The runtime semantics for the setting of these levels values is as follows: [0322]
  • The levels items of the Levels block are processed in declaration order. Any pin that occurs in more than one levels item will get processed multiple numbers of times. Multiple specification of values for a single parameter should be maintained and applied in specification order. [0323]
  • The resource parameters in a levels item are processed in the order they are specified. [0324]
  • The Delay statements cause the process of setting levels to pause for approximately the indicated duration, prior to setting the next group of levels. The actual wait time may be in a small system defined range around the specified delay. So if the delay was t seconds, the actual delay would satisfy: [0325]
  • t−Δt<=actual-wait<=t+Δt [0326]
  • The Delay statements divide up the Levels specification into a number of subsequences, each of which will require separate Test Condition Memory settings for processing. [0327]
  • The MinDelay statements cause the process of setting levels to pause for at least the specified duration prior to setting the next group of levels. The actual wait time may be in a small system defined range with a minimum value of the specified minimum delay. So if the minimum delay was t seconds, the actual delay would satisfy: [0328]
  • t<=actual-wait<=t+Δt [0329]
  • The MinDelay statements divide up the Levels specification into a number of subsequences, each of which will require separate Test Condition Memory settings for processing. [0330]
  • Each pin or pin-group name is specified in exactly one resource in a pin description file (suffix pin), and therefore has a certain set of viable resource parameters specified in the resource file (suffix .rsc). All the parameters named must be from among this set of viable resource parameters, and must be of the same elementary type as the expression used to set their value. Information about the names and types of resource parameters comes from the resource file. [0331]
  • The resource file Resources.rsc is implicitly imported, providing tester with the names and types for parameters of standard resources such as dpin, and dps. [0332]
  • Resource parameters are assigned expressions that can use UserVars, and values from named specification sets or a currently visible local specification set. [0333]
  • Dps pin resources have special parameters PRE_WAIT and POST_WAIT. The PRE_WAIT parameter specifies the time that needs to elapse from the time the power pin has reached its destination voltage to the time pattern generation can start. The POST_WAIT parameter specifies the time that needs to elapse from the time pattern generation has stopped to the time the power pin shuts off. [0334]
  • Dps pins also specify how the voltage parameter reaches its final value. They could specify it simply by an equation, as all other pin parameters. In that case the value will be reached as the hardware allows it. They could also specify it using a Slew statement. A Slew statement specifies that the power supply voltage reaches its final value from the initial value in a ramp with a specified absolute Voltage Slew Rate. [0335]
  • C++ for Levels [0336]
  • With above rules, a C++ Levels object can be written that supports the following operations: [0337]
  • There is an operation [0338]
  • Status setParameter(const String& pinOrPinGroupName, const String& parameterName, ElementaryType elementaryType, const Expression& Expression); [0339]
  • This operation binds an expression to a parameter of a pin or a pin group. For instance, the dpin.InPins VIH value is set by: [0340]
  • setParameter(“InPins”, “VIH”, VoltageT, Expression(“v_ih+1.0); [0341]
  • This operation will be called several times for all the declarations in the Levels object. [0342]
  • There is an operation [0343]
  • Status assignlevels(const String& selector); [0344]
  • which will go through and issue all the predetermined module level interfaces to assign all the levels of parameters in specification order, as described earlier. The selector parameter is used to resolve names in the expressions according to the rules specified earlier. [0345]
  • Test Condition Groups [0346]
  • The Test Condition Group Sub-language packages together the description of specifications, timings and levels. Timing objects are often specified using parameters. Parameters can be used in timings to specify leading and trailing edges of various pulses. Likewise, Levels can be parameterized by specifying maximum, minimum and typical values of various voltage levels. A Test Condition Group (TCG) object lumps together the specifications and the instantiation of Timings and Levels based on these specifications. [0347]
  • A TestConditionGroup declaration contains an optional SpecificationSet. The SpecificationSet declaration may be an inlined (and unnamed) local SpecificationSet, or it may be a reference to a named SpecificationSet declared elsewhere. The optional SpecificationSet declaration in a TCG declaration is followed by at least one Levels or Timings declaration. It can have both Levels and a Timings, in any order. However, it is disallowed from having more than one Levels and Timings declaration. These restrictions are syntactically enforced. [0348]
  • A specification set declaration in a TCG is identical to the specification set declared separately, except that it does not have a name. Its name is implicitly the name of the enclosing TCG. The Timings declaration comprises a single declaration of a Timings object from a specified timings file. Here is an example of a file with a test condition group: [0349]
    # ---------------------------------------------------------
    # File myTestConditionGroups.tcg
    # ---------------------------------------------------------
    Version 0.1;
    Import pentiumlevels.lvl;
    Import edges.spec;
    Import timing1.tim;
    Import timing2.tim;
    TestConditionGroup TCG1
    {
    # This Local SpecificationSet uses user-defined selectors
    # “min”, “max” and “typ”. Any number of selectors with any
    # user defined names is allowed.
    #
    # The specification set specifies a table giving values for
    # variables that can be used in expressions to initialize
    # timings and levels. The specification set below defines
    # values for variables as per the following table:
    # min max typ
    # v_cc 2.9 3.1 3.0
    # v_ih vInHigh + 0.0 vInHigh + 0.2 vInHigh + 0.1
    # v_il vInLow + 0.0 vInLow + 0.2 vInLow + 0.1
    # ...
    # A reference such as “vInHigh” must be previously defined
    # in a block of UserVars.
    #
    #Thus, if the “max” selector was selected in a functional
    # test, then the “max” column of values would be bound to
    # the variables, setting v_cc to 3.1, v_ih to vInHigh+2.0
    # and so on.
    #
    # Note that this is a local specification set, and has no
    # name.
    SpecificationSet(min, max, typ)
    {
    # Minimum, Maximum and Typical specifications
    for
    # voltages.
    V ltage v_cc = 2.9, 3.1, 3.0;
    Voltage v_ih = vInHigh + 0.0,
    vInHigh + 0.2,
    vInHigh + 0.1;
    Voltage v_il = vInLow + 0.0,
    vInLow + 0.2,
    vInLow + 0.1;
    # Minimum, Maximum and Typical specifications
    for
    # leading and trailing timing edges. The base
    # value of 1.0E−6 uS corresponds to 1 picosecond,
    # and is given as an example of using scientific
    # notation for numbers along with units.
    Time t_le = 1.0E−6 uS,
    1.0E−6 uS + 4.0 * DeltaT,
    1.0E−6 uS + 2.0 * DeltaT;
    Time t_te = 30ns,
    30ns + 4.0 * DeltaT,
    30ns + 2.0 * DeltaT;
    }
    # Refers to the Pentium3Levels imported earlier. It
    # is one of possibly many levels objects that have been
    # imported from the above file.
    Levels Pentium3Levels;
    # Refers to file timing1.tim containing the single
    # timing Timing1. The filename should be quoted if
    # it has whitespace characters in it.
    Timings Timing1;
    }
    # Another test condition group
    TestConditionGroup TCG2
    {
    # ClockAndDataEdgesSpecs is a specification set which
    # is available in the edges.specs file. Assume it has
    # the following declaration:
    # SpecificationSet ClockAndDataEdgesSpecs(min,
    max, typ)
    # {
    # Time clock_le = 10.00 uS, 10.02 uS,
    10.01 uS;
    # Time clock_te = 20.00 uS, 20.02 uS,
    20.01 uS;
    # Time data_le = 10.0 uS, 10.2 uS, 10.1 uS;
    # Time data_te = 30.0 uS, 30.2 uS, 30.1 uS;
    # }
    # A SpecificationSet reference to this named set is below:
    SpecificationSet ClockAndDataEdgesSpecs;
    # An inlined levels declaration. Since the associated
    # specification set (above) does not have variables such
    # as VInLow, VInHigh, VOutLow and VOutHigh, they must
    # resolve in the default UserVars collection.
    Levels
    {
    InPins { VIL = VInLow; VIH = VInHigh + 1.0; }
    OutPins { VOL = VOutLow / 2.0; VOH =
    VOutHigh; }
    }
    # This Timing is from the file “timing2.tim”. The timings
    # will need the leading and trailing edge timings for clock
    # and data as specified in the above specification set.
    Timings Timing2;
    }
  • In the above example, the test condition group TCG1 describes a specification set with three selectors named “min”, “typ” and “max”. There can be any number of distinct selectors. Within the body of the specification set, variables v_il, v_ih, t_le and t_te are initialized with triples of values, corresponding to the selectors. So in the above example, an instance of TCG1 with the selector “min” will bind the variable v_il with the first numeric value, (vInputLow+0.0). It bears repetition that the selectors for a specification set are user defined, and any number of them is allowed. The only requirement is that: [0350]
  • The selectors of a specification set be unique identifiers. [0351]
  • Each value specified in the specification set is associated with an array of values that exactly the same number of elements as the set of selectors. Picking the i[0352] th selector will cause each value to be bound to the ith value of its associated vector of values.
  • Subsequent to the specification set in the TCG, there could be a Levels declaration or a Timings declaration or both. The Levels declaration is used to set levels for various pin parameters. The variables identified in the specification set will be used to set these levels, permitting a dynamic binding of different actual values for pin parameters based on the selector used to initialize the TCG. [0353]
  • To exemplify this, consider a Test that enables the selector “min”. Referring to the specification set Pentium3Levels given on page, the pin parameter “VIH” for pins in the InPins group will be initialized to the expression (v_ih+1.0) by the declaration: [0354]
  • InPins{VIL=v_il; VIH=v_ih+1.0;}[0355]
  • This resolves to (VInHigh+0.0+1.0) when the selector “min” is enabled. Likewise, the Timings object can be initialized based on the selected values of the specification set variables. It is not necessary to have both a Timings and a Levels declaration. Either can be present by itself, or both in any order, as illustrated by the following example: [0356]
    # ---------------------------------------------------------
    # File LevelsOnlyAndTimingsOnly.tcg
    # ---------------------------------------------------------
    Version 0.1;
    # A Levels-only Test Condition Group.
    TestConditionGroup LevelsOnlyTCG
    {
    SpecificationSet(Min, Max, Typ)
    {
    Voltage v_il = 0.0, 0.2, 0.1;
    Voltage v_ih = 3.9, 4.1, 4.0;
    }
    # An inlined levels declaration. Since the associated
    # specification set (above) does not have variables such
    # as VInLow, VInHigh, VOutLow and VOutHigh, they must
    # resolve in the default UserVars collection.
    Levels
    {
    InPins { VIL = v_il; VIH = v_ih + 1.0; }
    OutPins { VOL = v_il / 2.0; VOH = v_ih; }
    }
    }
    # A Timings-only Test Condition Group
    TestConditionGroup TimingsOnlyTCG
    {
    SpecificationSet(Min, Max, Typ)
    {
    Time t_le = 0.9E−3, 1.1E−3, 1.0E−3;
    }
    Timings Timing2;
    }
  • Note, however, there should not be more than one Timings and more than one Levels in a TCG. Thus, in summary, there should be at least one of Timings or Levels, and at most one of each. [0357]
  • Test Conditions [0358]
  • A TestCondition object ties a TCG to a specific Selector. Once a TCG has been declared as shown above, it is possible to declare TestCondition objects as shown below: [0359]
    TestCondition TCMin
    {
    TestConditionGroup = TCG1;
    Selector = min;
    }
    TestCondition TCTyp
    {
    TestConditionGroup = TCG1;
    Selector = typ;
    }
    TestCondition TCMax
    {
    TestConditionGroup = TCG1;
    Selector = max;
    }
  • These Test Conditions would be instantiated in a Test Plan as follows: [0360]
    #
    # Declare a FunctionalTest “MyFunctionalTest” that refers
    to three
    # Test Condition Group instances.
    #
    Test FunctionalTest MyFunctionalTest
    {
    # Specify the Pattern List
    PList = pat1Alist;
    # Any number of TestConditions can be specified:
    TestCondition =TCMin;
    TestCondition = TCMax;
    TestCondition = TCTyp;
    }
  • Name Resolution in TCGs (Test Condition Groups) [0361]
  • Resolution of names in a test condition group was discussed earlier. However, these rules bear repetition, and are given below again: [0362]
  • 1. If the name is qualified (cf. page), it must be resolved in a named user variables collection. [0363]
  • 2. If the name is not qualified, the name is resolved in either a local specification set, if it is declared in the test condition group, or in the named specification set, if one is referenced in the test condition group. [0364]
  • 3. If the name is not resolved by the earlier rules, it is resolved in the default user variables collection. [0365]
  • TCG Runtime [0366]
  • Test condition groups have the following runtime semantics: [0367]
  • A Test (such as a FunctionalTest) will reference a TCG with a particular selector from its SpecificationSet, using an instantiated TestCondition. This selector will bind each variable in the SpecificationSet to its value associated with the chosen selector. This binding of variables to their values will then be used to determine Levels and Timings. [0368]
  • Parameter Levels in a TestConditionGroup are preferably set sequentially, in the order of presentation in the Levels block. So in the Pentium3Levels block, the order in which parameter levels would be set is as follows (notation: <resource-name>.<resource-parameter>): [0369]
  • InputPins.VIL, [0370]
  • InputPins.VIH, [0371]
  • OutputPins.VIL, [0372]
  • OutputPins.VIH, [0373]
  • Clock.VOL, [0374]
  • Clock.VOH. [0375]
  • This sequencing order enables the test writer to control the explicit power sequencing of power supplies. Furthermore, if a levels item occurs twice, naming the same pin-parameters for a pin, then that pin-parameter gets set twice. This can happen programmatically also. [0376]
  • If a parameter is set by a Slew statement such as [0377]
  • VCC=Slew(0.01, 2.0 V); [0378]
  • it means that VCC will reach its final value of 2.0 volts from its present value in a ramp with a Voltage Slew Rate of ±0.01 volts per second. [0379]
  • Specification set variables can also be passed into a Timings object in the TCG. The Timings object will then be initialized based on the selected variables. Such a mechanism could be used to customize a Timings object, as, for instance, by specifying leading and trailing edges of waveforms. [0380]
  • C++ for TCGs [0381]
  • With the above rules, the Test Condition Group can be declared in a C++ TestConditionGroup class, and initializing it as follows: [0382]
  • A call is made to the TestConditionGroup member function [0383]
  • Status setSpecificationSet(SpecificationSet pSpecificationSet); [0384]
  • which will set the specification set for the TestConditionGroup. This may either be a local specification set, or a named specification set, or null (if there is none). [0385]
  • A call is made to the TestConditionGroup member function [0386]
  • Status setLevels(Levels *pLevels); [0387]
  • which will set the Levels object for the TestConditionGroup. This may either be a locally declared levels object, or an externally declared levels object, or null (if there is none). [0388]
  • A call is made to the TestConditionGroup member function [0389]
  • Status setTimings(Timings *pTimings); [0390]
  • which will set the Timings object for the TestConditionGroup. This will be either an externally declared Timings object, or null (if there is none). [0391]
  • Bin Definitions [0392]
  • The Bin Definitions class defines bins, a collection of counters that summarize the results of testing many DUTs. During the course of testing a DUT, the DUT can be set to any bin, e.g., to indicate the result of a particular test. As testing proceeds, the DUT may be set to another bin. The bin that the DUT is finally set to is the last such setting at the end of the test. The counter for this final bin is incremented at the end of the test of this DUT. A separate file with bin definitions should have the suffix .bdefs. [0393]
  • Bin definitions are preferably hierarchical. For example, at an outermost level, there may be the PassFailBins with two bins named Pass and Fail. Then there could be several HardBins, some of which map to the Pass bin, and others which map to the Fail bin. The HardBins are said to be a refinement of the PassFailBins. Finally, there could be a large number of SoftBins, a refinement of HardBins, many of which map to the same Hard bin. Below is an example illustrating the hierarchy of bins: [0394]
    # ---------------------------------------------------------
    # File pentiumbins.bdefs
    # ---------------------------------------------------------
    Version 1.2.3;
    BinDefs
    {
    # The HardBins are an outermost level of
    # bins. They are not a refinement of any other
    # bins.
    BinGroup HardBins
    {
    “3GHzPass”: “DUTs passing 3GHz”;
    “2.8GHzPass”: “DUTs passing 2.8GHz”;
    “3GHzFail”: “DUTs failing 3GHz”;
    “2.8GHzFail”: “DUTs failing 2.8GHz”;
    LeakageFail: “DUTs failing leakage”;
    }
    # The SoftBins are a next level of refinement.
    # SoftBins are a refinement of HardBins.
    BinGroup SoftBins : HardBins
    {
    “3GHzAllPass”:
    “Good DUTs at 3GHz”, “3GHzPass”;
    “3GHzCacheFail”:
    “Cache Fails at 3GHz”, “3GHzFail”;
    “3GHzSBFTFail”:
    “SBFT Fails at 3GHz”, “3GHzFail”;
    “3GHzLeakage”:
    “Leakages at 3GHz”,  LeakageFail;
    “2.8GHzAllPass”:
    “Good DUTs at 2.8GHz”,“2.8GHzPass”;
    “2.8GHzCacheFail”
    “Cache Fails at 2.8GHz”,“2.8GHzFail”;
    “2.8GHzSBFTFail”:
    “SBFT Fails at 2.8GHz”, “2.8GHzFail”;
    “2.8GHzLeakage”:
    “Leakages at 2.8GHz”, LeakageFail;
    }
    }
  • In the above example, the most base bins are the BinGroup HardBins. A BinGroup X is said to be a group of base bins if some other BinGroup is a refinement of X. Thus, the BinGroup HardBins is a group of base bins since the BinGroup SoftBins is a refinement of HardBins. The bins of SoftBins are referred to as leaf bins. A BinGroup Y is said to be a group of leaf bins if no other BinGroup is a refinement of Y. [0395]
  • The degenerate case of a BinDefs block with a single BinGroup Z in it will have Z to be a group of most base bins, as well as a group of leaf bins. BinGroup names are global in scope. There can be any number of BinDefs blocks, but the declared BinGroups must be distinct. A BinGroup from one BinDefs block is allowed to be a refinement of a BinGroup from another BinDefs block. So in the above example, SoftBins could be in a separate BinDefs block from HardBins. However, it is strongly recommended to have a single BinDefs block with all the BinGroups defined for the sake of readability. [0396]
  • The above hierarchy can now be extended to count how many DUTs passed and failed, by adding another BinGroup. [0397]
    # ----------------------------------------------------------
    # File pentiumbins.bdefs
    # ----------------------------------------------------------
    Version 1.2.3;
    BinDefs
    {
    # The PassFailBins are an outermost level of
    # bins. They are not a refinement of any other
    # bins.
    BinGroup PassFailBins
    {
    Pass: “Count of passing DUTS.”;
    Fail: “Count of failing DUTS.”;
    }
    # The HardBins are a next level of refinement.
    # HardBins are a refinement of the PassFailBins,
    # as indicated by “HardBins : PassFailBins”.
    BinGroup HardBins : PassFailBins
    {
    “3GHzPass”: “DUTs passing 3GHz”, Pass;
    “2.8GHzPass”: “DUTs passing 2.8GHz”, Pass;
    “3GHzFail”: “DUTs failing 3GHz”, Fail;
    “2.8GHzFail”: “DUTs failing 2.8GHz”, Fail;
    LeakageFail: “DUTs failing leakage”, Fail;
    }
    # The SoftBins are a next level of refinement.
    # SoftBins are a refinement of HardBins.
    BinGr up SoftBins : HardBins
    {
    “3GHzAllPass”:
    “Good DUTs at 3GHz”, “3GHzPass”;
    “3GHzCacheFail”:
    “Cache Fails at 3GHz”, “3GHzFail”;
    “3GHzSBFTFail”:
    “SBFT Fails at 3GHz”, “3GHzFail”;
    “3GHzLeakage”:
    “Leakages at 3GHz”,  LeakageFail;
    “2.8GHzAllPass”:
    “Good DUTs at 2.8GHz”,“2.8GHzPass”;
    “2.8GHzCacheFail”:
    “Cache Fails at 2.8GHz”,“2.8GHzFail”;
    “2.8GHzSBFTFail”:
    “SBFT Fails at 2.8GHz”, “2.8GHzFail”;
    “2.8GHzLeakage”:
    “Leakages at 2.8GHz”, LeakageFail;
    }
    }
  • This time, the most base bins are the BinGroup PassFailBins. They are typically not a refinement of any bins. The BinGroup HardBins are a refinement of the PassFailBins and are also base bins. SoftBins are a refinement of the HardBins, and are a group of leaf bins. The above example had only three BinGroups in the hierarchy. [0398]
  • Below is a more complicated hierarchy: [0399]
    BinDefs
    {
    # A group of most base bins
    BinGroup A {...}
    # A group of base bins that is a refinement of A
    BinGroup Ax : A {...}
    # A group of leaf bins that is a refinement of Ax
    BinGroup Axx : Ax {...}
    # A group of base bins that is a refinement of A
    BinGroup Ay : A {...}
    # A group of leaf bins that is a refinement of Ay
    BinGroup Ayy : Ay {...}
    # A group of most base bins
    BinGroup B {...}
    # A group of leaf bins that is a refinement of B
    BinGroup Bx : B {...}
    }
  • In this example, Ax and Ay are refinements of A, Axx is a refinement of Ax and Ayy is a refinement of Ay. This example also provides BinGroups B and Bx where Bx is a refinement of B. The BinDefs declaration above with the BinGroups named PassFailBins, HardBins and SoftBins will be used as a continuing example in this section. [0400]
  • Each bin in a BinGroup has: [0401]
  • 1. a name which is either an identifier or a string literal [0402]
  • 2. a description which describes what this bin summarizes [0403]
  • 3. and if this bin is in a refinement BinGroup, the name of the bin it is a refinement of, also known as the base bin. [0404]
  • The two bins in PassFailBins are named “Pass” and “Fail”. The five bins in HardBins are named “3 GHzPass”, “2.8 GHzPass”, “3 GHzFail”, “2.8 GHzFail”, “LeakageFail”. Bin names may be a literal string, or an identifier. Bin names must be unique in a BinGroup, but may be duplicated across BinGroups. BinGroup names, however, are global in scope, and must be unique across a test plan. [0405]
  • Of the five HardBins, the bins “3 GHzPass” and “2.8 GHzPass” both map to the “Pass” bin of the PassFailBins. The rest of the HardBins map to the “Fail” bins of the PassFailBins. [0406]
  • Finally, there are eight SoftBins. The two failures at 3 GHz for SBFT (soft bin functional test) and Cache map to the “3 GHzFail” HardBin. Likewise the two failures at 2.8 GHz for SBFT and Cache map to the “2.8 GHzFail” HardBin. Both the failures due to Leakage map to the same “LeakageFail” HardBin, regardless of the speed at which they occurred. For example, the coarsest test (at the outermost level) is whether a DUT passes or fails a test. A refinement is, for example, whether the DUT passes or fails a test at a particular frequency, e.g., 3 GHz, etc. [0407]
  • Bins are assigned to DUTs in a Test Plan FlowItem, described below. A TestPlan FlowItem has a Result Clause in which the test plan describes the actions and transition to take place as the result of getting a particular result back from executing a test. It is at this point that a SetBin statement can occur: [0408]
    # A FlowItem Result clause. It is described later.
    Result 0
    {
    # Action to be taken on getting a 0 back from
    # executing a test.
    # Set the bin to SoftBin.“3GHZPass” expressing that the
    # DUT was excellent.
    SetBin SoftBins.“3GHzPass”;
    }
  • Many SetBin statements could execute during the course of running a test on a DUT. When the test is finally completed, the runtime will increment counters for the final bin that is set for that DUT, and for all its refinements. Consider a DUT which had the following SetBin statements executed during the course of its test: [0409]
  • SetBin SoftBins.“3 GHzSBFTFail”; [0410]
  • SetBin SoftBins.“2.8 GHzAllPass”; [0411]
  • This DUT passed the 3 GHz Cache and Leakage tests, but failed the SBFT test, and so was assigned to the “3 GHzSBFTFail” bin. It was then tested at 2.8 GHz, and all the tests passed. So the final bin assignment is to the “2.8 GHzAllPass” bin, which is in the set of SoftBins. This final assignment will increment the counters of the following bins: [0412]
  • 1. SoftBins.“2.5 GHzAllPass”[0413]
  • 2. which is a refinement of HardBins.“2.8 GhzPass”[0414]
  • 3. which is a refinement of PassFailBins.“Pass”[0415]
  • When the test completes, runtime will increment the counter of the final bin assignment of the DUT, and for all other bins it is a refinement of. [0416]
  • A SetBin statement is allowed only on a leaf bin. It is illegal to set a base bin. The counter incrementing semantics above assures that: [0417]
  • 1. If the bin is a leaf bin, it is the number of times a SetBin statement was executed for this bin at the end of testing a DUT. [0418]
  • 2. If the bin is a base bin, it is the sum of the counters of the bins that it is a refinement of. [0419]
  • Thus, in the above example, only SoftBins are allowed in a SetBin statement. The counter for HardBins.“LeakageFail” is the sum of the counters for SoftBins.“3 GHzLeakageFail” and SoftBins.“2.8 GHzLeakageFail”. Below are some rules regarding bin definitions: [0420]
  • 1. A BinDefinitions declaration is comprised of several BinGroup declarations. [0421]
  • 2. Each BinGroup declaration has a name, an optional BinGroup name that it is a refinement of, followed by a block of bin declarations. [0422]
  • 3. Bin declarations comprise a name, followed by a description, optionally followed by the name of a base bin that this bin is a refinement of. [0423]
  • 4. Bin names can be a string literal, or an Id. The empty string should not be a valid bin name. Bin names should be unique among names in the BinGroup declaration, but the same name could be used in other BinGroup declarations. [0424]
  • 5. If a BinGroup declaration Xxx is a refinement of another BinGroup declaration Yyy, then all of the bin declarations in Xxx must declare the name of a base bin from Yyy. Thus, each of the bin declarations in SoftBins is a refinement of a bin of HardBins, since the SoftBins are declared to be a refinement of HardBins. [0425]
  • 6. A BinGroup declaration that is not a refinement of another BinGroup declaration, such as PassFailBins will preferably have Bin declarations that do not declare base bins. [0426]
  • A bin Bbb has a set of bases which is the entire set of bins that Bbb is a refinement of. It is formally defined as follows: [0427]
  • 1. If Aaa is the base bin of Bbb, then Aaa is in the set of bases of Bbb. [0428]
  • 2. Any base of Aaa is also in the set of bases of Bbb. [0429]
  • BinGroup names are global in a TestPlan. [0430]
  • Bin names are local to a BinGroup. [0431]
  • A SetBin statement is only allowed for a leaf bin. [0432]
  • C++ for Bin Definitions [0433]
  • With above rules, an object type BinGroup can be constructed for each of the BinGroup declarations in the BinDefs declaration. The class BinGroup will have a subclass LeafBinGroup. The operations of these two classes are the same, except that BinGroup::incrementBin is a C++ protected operation, whereas LeafBinGroup::incrementBin is a C++ public operation. [0434]
  • The following is a default constructor which builds a BinGroup or a LeafBinGroup which is not a refinement of any other BinGroup. [0435]
  • Constructors: [0436]
  • BinGroup(BinGroup& baseBinGroup); [0437]
  • LeafBinGroup(BinGroup& baseBinGroup); [0438]
  • that builds a BinGroup that is a refinement of the given baseBinGroup. [0439]
  • A method [0440]
  • Status addBin(const String& binName, [0441]
  • const String& description, [0442]
  • const String& baseBinName); [0443]
  • to define a bin and its description. If it is a most base bin, the baseBinName parameter must be the empty string. [0444]
  • Methods to increment bin counters: [0445]
  • Status incrementbin(const String& binName); [0446]
  • This operation will increment the counter for this bin, and for all bins that are bases of this bin. The operation is protected in the class BinGroup, and is public in the class LeafBinGroup. [0447]
  • Methods to reset bin counters [0448]
  • Status resetbin(const String& binName); [0449]
  • This operation will reset the counter for this bin, and for all bins that are the bases of this bin. [0450]
  • Methods to get information about a bin: [0451]
  • Status getBinDescription(const String& binName, String& description); [0452]
  • Status getBaseBin(const String& binName, BinGroup*pBaseBinGroup, String& baseBinName); [0453]
  • Status getBinValue(const String& binName, unsigned int& value); [0454]
  • Iterators will be provided to get at all the currently defined bin names. [0455]
  • TestPlan state will be include number of BinGroup members, one for each BinGroup declaration. The C++ for the above BinDefinitions would be as follows: [0456]
    // TestPlan constructor
    TestPlan::TestPlan()
    : m_PassFailBins(),// Default Constructor
      m_HardBins(&m_PassFailBins),
      m_SoftBins(&m_HardBins)
    { }
    // Bin initializations
    m_PassFailBins.addBin(“Pass”,“Count of passing DUTS.”,“”);
    m_PassFailBins.addBin(“Fail”,“Count of failing DUTS.”,“”);
    m_HardBins.addBin(“3GHzPass”, “Duts passing 3GHz”,“Pass”);
    ...
  • State for a TestPlan includes a m_pCurrentBinGroup which is initialized to the undefined BinGroup (NULL) and the m_currentBin undefined bin name (the empty string). Each time a SetBin statement is executed, the m_pCurrentBinGroup is changed to the indicated the named BinGroup and the m_currentBin to the named bin in the group by a call: [0457]
    // Translation of: SetBin SoftBins.“3GHzAllPass”;
    pTestPlan->setBin(“SoftBins”,“3GHzAllPass”);
    When the test plan completes execution, it will call
    m_pCurrentBinGroup−>incrementBin(m_currentBin);
  • causing this bin and all its base bins to have their counters incremented. [0458]
  • The BinGroup counters are reset when the test plan is elaborated, but are not reinitialized each time a test is run. The counters can be reset by an explicit call to BinGroup::resetBin. [0459]
  • C. The Test Plan [0460]
  • The test plan can be thought of as a main structure of the test program. The Test Plan can import files, as well as define similar constructs inline. Thus, it is possible to import a file given definitions of some globals, as well as declaring additional globals inline. [0461]
  • C1. Test Plan Flows and FlowItems [0462]
  • One of the critical elements of the Test Plan is the Flow. A Flow encapsulates a finite state machine. It comprises several FlowItems which run an IFlowable object and then transition to another flow item. Running an IFlowable involves running an object that implements the IFlowable interface. Typical objects that implement the IFlowable interface are Tests and Flows themselves. [0463]
  • Thus, a Flow has FlowItems which runs Tests and other Flows, and then transition to another FlowItem. It also provides for the opportunity to call user customized routines on various return results from running an IFlowable. Typically, a Flow thus has the following form: [0464]
    #
    # FlowTest1 implements a finite state machine for the
    # Min, Typ and Max flavors of MyFunctionalTest1. On
    # success it tests Test1Min, Test1Typ, Test1Max
    # and then returns to its caller with 0 as a successful
    # status. On failure, it returns 1 as a failing status.
    #
    # Assume that the tests MyFunctionalTest1Min, ... all
    # return a Result of 0 (Pass), 1 and 2 (for a couple
    # of levels of failure).
    # Result 0 Result 1 Result 2
    # Test1Min Test1Typ return 1 return 1
    # Test1Typ Test1Max return 1 return 1
    # Test1Max return 0 return 1 return 1
    #
    Flow FlowTest1
    {
    FlowItem FlowTest1_Min MyFunctionalTest1Min
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    GoTo FlowTest1_Typ;
    }
    Result 1
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    Return 1;
    }
    # This result block will be executed if
    # MyFunctionalTest1Min returns any of
    # 2, 5, 6, 7, −6, −5 or −4
    Result 2, 5:7, −6:−4
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    Return 1;
    }
    }
    FlowItem FlowTest1_Typ {...}
    Fl wItem FlowTest1_Max {...}
    }
  • The operation of the Flow FlowTest1 is as follows: [0465]
  • 1. Starts up with executing FlowItem FlowTest1_Min. [0466]
  • 2. FlowTest1_Min runs a functional test, MyFunctionalTest1Min. Details of this test are provided when the complete test plan is presented below. [0467]
  • 3. Nine results are expected from running this test, 0, 1, 2, 5, 6, 7, −6, −5 or −4. The first two Result clauses handle 0 and 1 respectively, and the third handles all the rest of the result values. [0468]
  • 4. If result “0” (pass) occurs, then FlowTest1_Min will increment the counter PassCounter. It will then transition to a new FlowItem FlowTest1 Typ. [0469]
  • 5. If result “1” or result “2” occurs, then FlowTest1_Min will increment the counter FailCounter, and return from the flow. [0470]
  • 6. FlowTest1_Typ will operate in the same way, and on success call FlowTest1_Max. [0471]
  • 7. FlowTest1_Max will operate in the same way, and on success return from FlowTest1 with a successful result (“0”). [0472]
  • Thus, FlowTest1 will, on a successful run, run a device through the minimum, typical and maximum versions of Test1, and then return. FlowTest2 will operate in a like manner. [0473]
  • A Flow as described above basically describes a Finite State Machine with states and transitions. The FlowItems are basically states, which will do the following: [0474]
  • 1. Execute an IFlowable (it could be a previously defined Flow, or a Test, or a user defined Flow that can be implemented in C++ with the above rules). [0475]
  • 2. Execution of the IFlowable return a numeric result. Based on the result, certain actions occur (updating some counters), and then one of two things happen: [0476]
  • a. The Flow returns to the caller with a numeric result. [0477]
  • b. The Flow continues by transitioning to another state (FlowItem). [0478]
  • Thus, a FlowItem has the following components: [0479]
  • A FlowItem has a name. [0480]
  • A FlowItem has an IFlowable to be executed. [0481]
  • A FlowItem has a number or Result clauses. [0482]
  • Each Result clause of a FlowItem provides actions and ends with a transition and is associated with one or more result values. [0483]
  • These items are syntactically as follows in a FlowItem. [0484]
    FlowItem <name> <IFlowable to be executed>
    {
    Result <one or more result values>
    {
    <actions for these result values>
    <transition for these result values>
    }
    Result <one or more other result values>
    {
    ...
    }
    ...
    }
  • The IFlowable to be executed could be either a Test, or a User-defined IFlowable, or a Flow. The actions for a result could be any of the following: [0485]
  • A Property Action to set string valued entities that are used by GUI tools to attribute results. This can be seen in the above FlowTest1 example with: [0486]
  • Property PassFail=“Pass”; [0487]
  • Properties are basically named string or integer valued entities that are associated with a Result clause. There can be any number of them, and they are preferably used by tools such as GUIs which a user would use to display information associated with this result. They have no effect on the actual result of the test, or the flow of the test. [0488]
  • A Counters Action to increment some number of counters. This can be seen in the above example with: [0489]
  • IncrementCounters PassCount; [0490]
  • A Routine Call Action to call an arbitrary or user routine. This is discussed later. [0491]
  • Finally, a FlowItem has a Transition which could either be a GoTo statement to transfer control to another FlowItem, or a Return statement to transfer control back to the caller (either a calling flow, or the system routine which initiated the test plan). [0492]
  • Predefined Flows [0493]
  • The typical use of Flow objects is to define a sequence of Tests. This sequence is then executed as a result of an event occurring in a Test Plan Server (TPS), i.e. the Execute Test Plan event. A test plan server on each site controller executes the user's test plan. However, Flow objects are also executed in response to other events. The name in parentheses is the name used in assigning Flows to these events. [0494]
  • 1. System Load Flow (SysLoadFlow). This Flow is executed on the System Controller when a Test Plan is loaded onto one or more Site Controllers. It is executed prior to the actual loading of the Test Plan on any Site Controller. This flow allows the Test Plan developer to define actions that should originate from the System Controller. Such actions include broadcast load of Pattern files, Calibration actions, etc. [0495]
  • 2. Site Load Flow (SiteLoadFlow). This Flow is executed on the Site Controller after a Test Plan has been loaded onto the Site and initialized. This allows any Site-specific initialization to occur. [0496]
  • 3. Lot Start/End Flows (LotStartFlow/LotEndFlow). These Flows execute on the Site Controllers when the Test Plan Server is notified of a start of a new lot. This is typically used in production environments to annotate datalog streams with lot-specific information. [0497]
  • 4. DUT Change Flow (DutChangeFlow). This Flow executes on the Site Controller when its DUT information changes. Again, this is typically used in production environments to update datalog streams. [0498]
  • 5. TestPlan Start/End Flows (TestPlanStartFlow/TestPlanEndFlow). These Flows execute on the Site Controller when the Test Plan Server is instructed to start executing the current Test Flow and when that flow finishes its execution. [0499]
  • 6. Test Start/End Flows (TestStartFlow/TestEndFlow). These Flows execute on the Site Controller when the Test Flow is starting to run a new Test and when that Test finishes its execution. [0500]
  • 7. Test Flow (TestFlow). This Flow is the main Flow object executed when the Test Plan Server receives an “Execute Test Plan” message. [0501]
  • Note that if a user defines a Flow in the user's Test Plan that is not the TestFlow or one of the other pre-defined flows, the preferred way to have it executed is to include it in the transition states of one of these pre-defined flows. [0502]
  • A Test Plan Example [0503]
  • In the example below, Flows are given along with comments that describe the finite state machine implemented by the flow. The finite state machine is given as a transition matrix. Rows of the matrix correspond to FlowItems, and columns to the result. The entries of a row of the matrix indicate the FlowItem that is transitioned to from the FlowItem of the row when the returned Result is the value specified in the column. [0504]
  • A Test Plan with three flows, FlowTest1, FlowTest2 and FlowMain, is shown below. FlowTest1 will operate as described above. It will run a test named MyFunctionalTest1 in each of the “min”, “typ” and “max” configurations. Likewise, FlowTest2 will run MyFunctionalTest2 in each of these configurations. Finally, FlowMain will run FlowTest1 and FlowTest2. The finite state machine transition matrix is provided in comments at the start of each of these flows. [0505]
    # ---------------------------------------------------------
    # File mySimpleTestPlan.tpl
    # ---------------------------------------------------------
    Version 0.1;
    Import xxx.pin; # Pins
    # Constants and variables giving limiting values.
    Import limits.usrv;
    # Import test condition groups
    Import myTestConditionGroups.tcg;
    # Import some bin definitions.
    Import bins.bdefs;
    # ---------------------------------------------------------
    # Start of the test plan
    # ---------------------------------------------------------
    TestPlan Sample;
    # This block defines Pattern Lists file-qualified names and
    # Pattern List variables that are used in Test declarations.
    # Pattern list variables are deferred till customization is
    # examined.
    PListDefs
    {
    # File qualified pattern list names
    pl1A.plist:pat1Alist,
    pl2A.plist:pat2AList
    }
    # The socket for the tests in this test plan (this is not imported,
    # but resolved at activation time):
    SocketDef = mytest.soc;
    # Declare some user variables inline
    UserVars
    {
    # String name for current test
    String CurrentTest = “MyTest”;
    }
    Test Condition TC1Min
    {
    TestConditionGroup = TCG1;
    Selector = min;
    }
    TestCondition TC1Typ
    {
    TestConditionGroup = TCG1;
    Selector = typ;
    }
    TestCondition TC1Max
    {
    TestConditionGroup = TCG1;
    Selector = max;
    }
    # Likewise for TC2Min, TC2Typ, TC2Max ...
    #
    # Declare a FunctionalTest. “FunctionalTest” refers to a C++
    # test class that runs the test, and returns a 0, 1 or 2 as
    # a Result. The Test Condition Group TCG1 is selected with
    # the “min” selector by referring to the TC1Min TestCondition.
    #
    Test FunctionalTest MyFunctionalTest1Min
    {
    PListParam = pat1AList;
    TestConditionParam = TC1Min;
    }
    # Another FunctionalTest selecting TCG1 with “typ”
    Test FunctionalTest MyFunctionalTest1Typ
    {
    PListParam = pat1AList;
    TestConditionParam = TC1Typ;
    }
    # Another FunctionalTest selecting TCG1 with “max”
    Test FunctionalTest MyFunctionalTest1Max
    {
    PListParam = pat1AList;
    TestConditionParam = TC1Max;
    }
    # Now select TCG2 with “min”
    Test FunctionalTest MyFunctionalTest2Min
    {
    PListParam = pat2AList;
    TestConditionParam = TC2Min;
    }
    # Likewise for TCG2 with “typ” and TCG2 with “max”
    Test FunctionalTest MyFunctionalTest2Typ
    {
    PListParam = pat1AList;
    TestConditionParam = TC2Typ;
    }
    Test FunctionalTest MyFunctionalTest2Max
    {
    PListParam = pat1AList;
    TestConditionParam = TC2Max;
    }
    #
    # At this time the following Test objects have been defined
    # MyFunctionalTest1Min
    # MyFunctionalTest1Typ
    # MyFunctionalTest1Max
    # MyFunctionalTest2Min
    # MyFunctionalTest2Typ
    # MyFunctionalTest2Max
    #
    #
    # Counters are variables that are incremented during the
    # execution of a test. They are UnsignedIntegers that are
    # initialized to zero.
    #
    Counters {PassCount, FailCount}
    #
    # Flows can now be presented. A Flow is an object that
    # essentially represents a finite state machine which
    # can execute “Flowables”, and transition to other flowables
    based
    # on the Result returned from executing a Flowable. A Flow can also
    # call another flow.
    #
    # A Flow consists of a number of Flow Items and transitions
    # between them. FlowItems have names which are unique in
    # the enclosing Flow, execute a “Flowable” object, and then
    # transition to another FlowItem in the same enclosing Flow.
    #
    # Flowable objects include Tests and other Flows. When
    # a Flowable object executes, it returns a numeric Result
    # which is used by the FlowItem to transition to another
    # FlowItem. As a result of this, both Tests and Flows
    # terminate by returning a numeric Result value.
    #
    # FlowTest1 implements a finite state machine for the
    # Min, Typ and Max flavors of MyFunctionalTest1. On
    # success it tests Test1Min, Test1Typ, Test1Max
    # and then returns to its caller with 0 as a successful
    # Result. On failure, it returns 1 as a failing Result.
    #
    # Assume that the tests MyFunctionalTest1Min, ... all
    # return a Result of 0 (Pass), 1 and 2 (for a couple
    # of levels of failure). The Transition Matrix of the
    # finite state machine implemented by FlowTest1 is:
    # -----------------------------------------------------------
    # Result 0 Result 1 Result 2
    # -----------------------------------------------------------
    # FlowTest1_Min FlowTest1_Typ return 1 return
    1
    # FlowTest1_Typ FlowTest1_Max return 1 return
    1
    # FlowTest1 Max return 0 return 1 return 1
    #
    # where the IFlowables run by each FlowItem are:
    # FlowItem IFlowable that is run
    # FlowTest1_Min MyFunctionalTest1Min
    # FlowTest1_Typ MyFunctionalTest1Typ
    # FlowTest1_Max MyFunctionalTest1Max
    #
    Flow FlowTest1
    {
    FlowItem FlowTest1_Min MyFunctionalTest1Min
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    GoTo FlowTest1_Typ;
    }
    Result 1,2
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    Return 1;
    }
    }
    FlowItem FlowTest1_Typ MyFunctionalTest1Typ
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    GoTo FlowTest1_Max;
    }
    Result 1,2
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    Return 1;
    }
    }
    # Likewise for FlowTest1_Max
    FlowItem FlowTest1_Max MyFunctionalTest1Max
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    Return 0;
    }
    Result 1,2
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    Return 1;
    }
    }
    }
    #
    # FlowTest2 is similar to FlowTest1. It implements a
    # finite state machine for the Min, Typ and Max flavors
    # of MyFunctionalTest2. On success it tests Test2Min,
    # Test2Typ, Test2Max and then returns to its caller with
    # 0 as a successful Result. On failure, it returns 1 as
    # a failing Result.
    #
    # Assume that the tests MyFunctionalTest2Min, ... all
    # return a Result of 0 (Pass), 1 and 2 (for a couple
    # of levels of failure). The Transition Matrix of the
    # finite state machine implemented by FlowTest2 is:
    # -----------------------------------------------------------
    # Result 0 Result 1 Result 2
    # -----------------------------------------------------------
    # FlowTest2_Min FlowTest2_Typ return 1 return
    1
    # FlowTest2_Typ FlowTest2_Max return 1 return
    1
    # FlowTest2_Max return 0 return 1 return 1
    #
    # Where the IFlowables run by each FlowItem are:
    # FlowItem IFlowable that is run
    # FlowTest2_Min MyFunctionalTest2Min
    # FlowTest2_Typ MyFunctionalTest2Typ
    # FlowTest2_Max MyFunctionalTest2Max
    #
    Flow FlowTest2
    {
    #...
    }
    #
    # Now the FlowMain, the main test flow, can be presented. It
    # implements a finite state machine that calls FlowTest1
    # and FlowTest2 as below:
    # ------------------------------------
    # Result 0 Result 1
    # ------------------------------------
    # FlowMain_1 FlowMain_2 return 1
    # FlowMain_2 return 0 return 1
    #
    # Where the IFlowables run by each FlowItem are:
    # FlowItem IFlowable that is run
    # FlowMain_1 FlowTest1
    # FlowMain_2 FlowTest2
    Flow FlowMain
    {
    # The first declared flow is the initial flow to be
    # executed. It goes to FlowMain_2 on success, and
    # returns 1 on failure.
    FlowItem FlowMain_1 FlowTest1
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    GoToFlowMain_2;
    }
    Result 1
    {
    # Sorry ... FlowTest1 failed
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    # Add to the right soft bin
    SetBin SoftBins.“3GHzSBFTFail”;
    Return 1;
    }
    }
    FlowItem FlowMain_2 FlowTest2
    {
    Result 0
    {
    # All passed!
    Pr perty PassFail = “Pass”;
    IncrementC unters PassCount;
    # Add to the right soft bin
    SetBin SoftBins.“3GHzAllPass”;
    Return 0;
    }
    Result 1
    {
    #FlowTest1 passed, but FlowTest2 failed
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    # Add to the right soft bin
    SetBin SoftBins.“3GHzCacheFail”;
    Return 1;
    }
    }
    }
    TestFlow = FlowMain;
  • The above test plan is structured as follows in a preferred order: [0506]
  • 1. First, a version number is provided. This number is used to ensure compatibility with the compiler version. [0507]
  • 2. Then, a number of imports are declared. These are various files with declarations needed in order to resolve names used in the test plan. [0508]
  • 3. Next, the Test Plan name is declared, after which come the inline declarations of the test plan. [0509]
  • 4. Next a set of PListDefs are declared. These include file-qualified names naming GlobalPLists from the named files. They also include Pattern List variables. Pattern List variables are variables that can be initialized in custom flowables at execution time. They provide a means of delaying binding tests to actual pattern lists until runtime. [0510]
  • 5. Next, a set of UserVars is declared. These include a string. [0511]
  • 6. Some Counters are then declared, to determine the number of tests passed and failed. Counters are simply variables that are initialized to zero, and incremented at IncrementCounter statements. They are different from Bins described earlier which have the semantics that only the currently set bin is incremented at the end of the test of a DUT. [0512]
  • 7. Next, a series of Test Conditions is declared. Each of these specifies a Test Condition Group and a selector. In this example, the Test Condition Groups come from mytestconditionsgroups.tcg. However, they could have been inline in the test plan. [0513]
  • 8. Next, a series of Flowables or Tests is declared. Each of this is known Test FunctionalTest which selects a Pattern List and a test condition. Thus for instance, MyFunctionalTest1Max selects the test condition TC1Max and a pattern list. [0514]
  • 9. Following this, three flows are declared, FlowTest1, FlowTest2 and FlowMain. Flows run Flowables. Flowables include Tests (such as MyFunctionalTest1Max) and other flows (such as FlowTest1 and FlowTest2). Each of FlowTest1 and FlowTest2 run through the minimum, typical and maximum versions of Test1 and Test2 respectively. The flow FlowMain calls the earlier declared flows, FlowTest1 and then FlowTest2. [0515]
  • 10. Finally, the TestFlow event is assigned to the FlowMain Flow. Thus the flow FlowMain is the one that will be executed by this test plan when a user chooses to Execute this plan. [0516]
  • C++ for Flows [0517]
  • With the above rules, a C++ implementation can be done for most of the elements, with the exception of the Flows themselves. [0518]
  • C++ for FlowItems [0519]
  • The C++ class to represent a FlowItem may have the following interface: [0520]
  • An operation [0521]
  • Status setFlowable(IFlowable*pIFlowable); [0522]
  • which will set the IFlowable that will be executed for this FlowItem. [0523]
  • Once the FlowItem returns from the set of calls needed to execute this IFlowable, it will need to increment a list of counters depending on the Result value. To this end, the FlowItem needs to have a vector of counters that is to be incremented. This is initialized by a call: [0524]
  • Status setCounterRefs(unsigned int result, CounterRefList counterRefs); [0525]
  • Calling this sets up a vector of references to counters into the FlowItem, so that it can increment them once the IFlowable completes execution. For example, the statement [0526]
  • IncrementCounters A, B, C; [0527]
    would preferably use the above call as follows:
    // Somewhere earlier
    CounterRefList counters;
    ...
    // Code for Result clause
    //  Result 2, 3 {...}
    // of flowObject.
    counters.reset( );
    counters.add(&A);
    counters.add(&B);
    counters.add(&C);
    flowObject.setCounterRefs(2, counters);
    flowObject.setCounterRefs(3, counters);
  • A temporary CounterRefList object named counters is used. Initially counters.reset( ) is called, followed by a number of counters.add( ) calls to set up the counters list. This is then used to setup the vector of counter addresses to be updated for [0528] result values 2 and 3.
  • The FlowItem may then need to transition to another FlowItem on a particular result: [0529]
  • Status setTransition(unsigned int result, FlowItem*pFlowItem); [0530]
  • Several such calls will naturally need to be made in the case that a certain Result clause deals with many result values. [0531]
  • The FlowItem may need to return a result. This is done by: [0532]
  • Status setReturnResult(unsigned int result, unsigned int returnResult); [0533]
  • For example, for the FlowItem FirstFlowItem in the previous example, the above would be called with the value “2” for “result” and “1” for “returnResult”. [0534]
  • Finally, the FlowItem needs an operation to execute: [0535]
  • Status execute(unsigned int& result, FlowItem*pNextFlowItem); [0536]
  • This operation will execute the IFlowable, then update the indicated counters, and then either return a Result, or a pointer to the next FlowItem. If this pointer is NULL, then the result is the returned value. [0537]
  • The code that would be generated for [0538] FlowItem FlowMain 1 is as follows:
    FlowItem FlowMain_1;
    FlowItem FlowMain_2;
    CounterRefList counters;
    FlowMain_1.setFlowable(FlowTest1);
    // Result 0
    counters.reset( );
    counters.add(&PassCount);
    FlowMain_1.setCounterRefs(0, counters);
    FlowMain_1.setTransition(0, &FlowMain_2);
    // Result 1
    counters.reset( );
    counters.add(&FailCount);
    FlowMain_1.setCounterRefs(1, counters);
    // The following call from ITestPlan will set the
    // current bin group and bin name.
    pTestPlan−>setBin(“SoftBins”,“3GHzSBFTFail”);
    FlowMain_1.setReturnResult(1, 1);
  • The code generated above sets up [0539] FlowMain 1 to run the IFlowable “FlowTest1”, and then sets it up to increment the appropriate list of counters for each result, and finally to take the necessary actions. The necessary action in the case of result “0” is a transition to FlowMain 1, and in the case of result “1” is a return.
  • C2. Counter Support in a TestPlan [0540]
  • Counters are variables that are initialized to zero, and can be incremented by an IncrementCounter statement at various points during a test run. They are different from Bins, which are incremented only at the end of the test. Furthermore, bins are hierarchical while counters are simple variables. Thus, counters are a much simpler and more limited facility than bins. [0541]
  • Counters can be supported in a TestPlan via a member of a Counters class that maintains a set of named counters which are unsigned integers. Objects will be defined in this class via a Counters declaration. Counters will not be automatically reset when a test starts, thus allowing a TestPlan to gather counts over testing many DUTs. Methods will be provided to reset, increment and query the value of a counter. This enables an alternative to binning in order to determine counts as a result of running a test. [0542]
  • The TestPlan preferably contains a member variable, m_modifiedCounters, which is the set of counters modified by running the test on a DUT. This set is initialized to the empty set at the start of the test. At each place an IncrementCounters call is made, code will be generated to add the named counters to the m_modifiedCounters member. Thus, this member gathers together all the counters that were modified during the execution of a test on a DUT. [0543]
  • C++ for the Flow Object [0544]
  • Once all the FlowItems have been created, the Flow object can be created as a C++ object as shown below: [0545]
  • An operation to add a FlowItem [0546]
  • Status addFlowItem(FlowItem*pflowItem, bool is InitalFlowItem); [0547]
  • which will add the indicated FlowItem to the Flow. The boolean is set to True if this is the initial FlowItem of the Flow. [0548]
  • An operation to execute the Flow [0549]
  • Status executeFlow(unsigned int& result); [0550]
  • This will preferably return when the Flow returns, with the result of executing the flow. The action of this is to start executing the flow with the initial FlowItem. It will keep executing FlowItems as long as the current FlowItem returns a next FlowItem to execute. When the current FlowItem returns a Result, then this operation completes with that Result. [0551]
  • Hence, the C++ code generated for a Flow has several repeated calls to addFlowItem( ) in order to add FlowItems to the Flow. The executeFlow( ) operation will occur when this Flow in the Test Plan is selected for execution. [0552]
  • C3. Test Classes [0553]
  • In general majority of the program code is data for device test, and the rest is the code of test program, which realizes the test methodology. This data is DUT-dependent (e.g., power supply conditions, signal voltage conditions, timing conditions, etc.). The test code consists of methods to load the specified device conditions on to ATE hardware, and also those needed to realize the user specified objectives (such datalogging, etc). [0554]
  • As explained above, to increase the reusability of test code, such code should be independent of any device-specific data (e.g., pin name, stimulus data, etc.), or device-test-specific data (e.g., conditions for DC units, measurement pins, number of target pins, name of pattern file, addresses of pattern programs, etc.). If code for a test is compiled with data of these types, the reusability of the test code would decrease. Therefore, any device-specific data or device-test-specific data should be made available to the test code externally, as inputs during code execution time. [0555]
  • In the open architecture test system, a Test Class, which is an implementation of the ITest interface, realizes the separation of test data and code (and hence, the reusability of code) for a particular type of test. Such a test class could be regarded as a “template” for separate instances of it, which differ from each other only on the basis of device-specific and/or device-test-specific data. Test classes are specified in the test plan file. Each Test class typically implements a specific type of device test or setup for device test. For example, Functional, AC and DC Parametric tests are preferably implemented by separate Test classes. However, custom test classes can also be used in test plans. [0556]
  • Test classes allow the user to configure class behavior by providing parameters that are used to specify the options for a particular instance of that test. For example, a Functional Test will take parameters PList and TestConditions, to specify the Pattern List to execute, and the Level and Timing conditions for the test, respectively. Specifying different values for these parameters (through the use of different “Test” blocks in the test plan description file) allows the user to create different instances of a Functional Test. FIG. 5 shows how [0557] different test instances 502 would be derived from a single test class 504.
  • These classes should be designed to allow the [0558] compiler 400 to take the description of the tests and their parameters from the test plan file and generate correct C++ code, which can be compiled and linked to generate the test program. Test class instances may be added to objects describing test flow to create a complex execution sequence of device tests.
  • C4. Derivation from ITest and IFlowable [0559]
  • As mentioned above, Test classes derive from ITest. With the above rules, these can be implemented in C++ classes that implement the ITest interface. In addition to the methods specified for the ITest interface, these classes provide the Test-specific intelligence and logic required to perform specific classes of device test. Test classes also implement the IFlowable interface. As a consequence of this, instances of Test classes can be used in FlowItems to run tests. [0560]
  • Customization [0561]
  • Customization mechanisms are provided to allow users to call C functions, and develop their own classes implementing the ITest and IFlowable interfaces. [0562]
  • Introspection Capability [0563]
  • If an object of a Test class could be interrogated regarding its methods and signatures, then it could be verified that the appropriate parameters are available for inclusion in the generated source code. Such a feature would be very useful for error checking and validation during the translation phase. If the test engineer made a mistake in the names of parameters, or the number (or possibly the types) of arguments to these parameters, the translation phase could catch it and provide a meaningful error message at translation time instead of waiting for a compile-time error message from the C++ compiler. This would be more useful to the test engineer. [0564]
  • Introspection refers to the ability to ask an object to look within itself and return information regarding its attributes and methods. Some languages, such as Java, provide this ability as a part of the language. Other languages, such as Visual Basic, impose such a requirement on objects intended to be used with it. C++ makes no provisions for this feature. [0565]
  • This method also lends well to providing for default parameter values, as well as indications of optional parameters. In addition, if this capability is provided as a part of the implementation of all Test classes, then GUI applications could also use this information to dynamically build up dialogs and other user interface elements to help engineers make effective use of these classes. [0566]
  • These complexities are offset in an embodiment of the invention through a mechanism that provides, in lieu of full introspection, a method that allows the Test class developer to fully specify, in a single text-based source file (per Test class), the public methods/attributes of the Test class that the developer has designated as the ones required to parameterize the class. [0567]
  • A single source is preferred: one would not want to have the description of the parameterization interface of a Test class in one file, and the C++ interface description in another independent (header) file, and then be burdened with the need to keep both sources synchronized. Towards this end, the “text-based” description is embedded in a pre-header file for the Test class, which is used by the compiler for limited introspection, as well for generating the C++ header for the Test class. The generated C++ header file is the one used to finally compile the Test class C++ code. [0568]
  • The Pre-Headers [0569]
  • The use of headers in C++ is well known. Because C++ is difficult to parse and read, however, an embodiment of the invention defines a syntax allowing the compiler to create a C++ output which can be used as a header by a test class developer. According to this embodiment, the test class developer writes a pre-header, which is output by the [0570] compiler 400 as a header file, allowing visibility into the corresponding test classes or other test entities.
  • The following example illustrates the concept of the pre-header file for a Test class in accordance with the preferred embodiment of the present invention. Consider the following excerpt from a source file, with a test FuncTest1: [0571]
    ...
    TestConditionTC1
    {
    TestConditionGroup = TCG1; # Previously defined TCG for
    Levels
    Selector = min;
    }
    TestCondition TC2
    {
    TestConditionGroup = TCG2; # Previously defined TCG for
    Timing
    Selector = min;
    }
    ...
    Test FunctionalTest FuncTest1
    {
    PListParam = patList1; # Previously defined pattern list
    TestConditionParam = TC1;
    TestConditionParam = TC2;
    }
  • The compiler needs to know what a FunctionalTest entails in order to determine whether the declaration of FuncTest1 above is legal. Rather than building in the knowledge of a FunctionalTest into the compiler, the definition of what a FunctionalTest entails can be specified in the Pre-Header. [0572]
  • Assume that FunctionalTest is a C++ class having base classes Test1 and Test2, and having members which are a PList, and an array of TestConditions. The compiler needs to know about the types of the members of FunctionalTest in order to recognize that the above declaration of FuncTest1 is legal. [0573]
  • Furthermore, in order to generate a C++ object declaration for FuncTest1, a C++ header for the class FunctionalTest needs to be constructed. This requires compiler to also know about the base classes of the FunctionalTest class, the names of its members and other such information. [0574]
  • The pre-header sub-language of an embodiment of the invention provides the compiler with the information it needs to both recognize the legality of declarations, and to generate C++ headers and object declarations that correspond to declaration. [0575]
  • Note that a FunctionalTest is a simple type (as far as parameterization is concerned), and thus, would use quite a simple description for parameterization. One could thus write a pre-header, FunctionalTest.ph, that supports the above parameterization as follows (assume that pre-headers are available for the base test classes Test1 and Test2): [0576]
     1 Version 1.0;
     2 #
     3 # Parameterization specification pre-header for FunctionalTest
     4 #
     5 Import Test1.ph; # For base class Test1
     6 Import Test2.ph; # For base class Test2
     7 TestClass = FunctionalTest; # The name of this test class
     8 PublicBases = Test1,Test2; # List of public base classes
     9 # The parameters list or “parameter block”:
    10 Parameters
    11 {
    12 # The following declaration specifies that a FunctionalTest has
    13 #  - a parameter of typePList
    14 #  - [represented by C++ type Tester::PatternTree]
    15 #  - stored in a member named m_pPatList
    16 #  - a function to set it named setPatternTree.
    17 #  - a parameter description for the GUI to use as a tool tip
    18 PList PListParam
    19 {
    20 Cardinality = 1 ;
    21 Attribute = m_pPatList;
    22 SetFunction = setPatternTree;
    23 Description = “The PList parameter for a Functional
    Test”;
    24 }
    25 #
    26 # The following declaration specifies that a FunctionalTest has
    27 #  - 1 or more parameters of type TestCondition
    28 #  - [represented by C++ type Tester::TestCondition]
    29 #  - stored in a member named m_testCondnsArray
    30 #  - a function to set it named addTestCondition.
    31 #  - a parameter description for the GUI to use as a tool tip
    32 # The [implement] clause causes the translation phase of
    to
    33 # generate a default implementation of this function.
    34 #
    35 TestCondition TestConditionParam
    36 {
    37 Cardinality = 1−n;
    38 Attribute = m_testCondnsArray;
    39 SetFunction = addTestCondition [Implement];
    40 Description = “The TestCondition parameter for a
    FunctionalTest”;
    41 }
    42 }
    43 #
    44 # The section below is part of the Pre-Header which is an escape
    45 # into C++ code. This will be referred to as a “template
    block.”
    46 #
    47 # Everything in this section will be reproduced verbatim in the
    48 # generated header file, except for “$Class”, “$Inc”,
    49 # “$ParamAryTypes”, “$ParamAttrs”, “$ParamFns” and
    “$ParamImpls”.
    50 #
    51 # Note that no comments beginning with the ‘#’ character
    are
    supported
    52 # within the following section.
    53 #
    54 CPlusPlusBegin
    55 $Inc
    56 namespace
    57 {
    58 class $Class
    59 {
    60 // Array types for parameters storage:
    61 $ParamAryTypes
    62 public:
    63 virtual void preExec( );
    64 virtual void exec( );
    65 virtual void postExec( );
    66 $ParamFns
    67 ...
    68 private:
    69 double m_someVar;
    70 $ParamAttrs
    71 ...
    72 };
    73 ...
    74 $ParamImpls
    75 } // End namespace
    76 CPlusPlusEnd
  • As the compiler processes a pre-header file, it builds up the values of the compiler variables such as $Inc, $Class, $ParamAryTypes and others. This enables it to then create the following C++ header by generating the C++ code above verbatim, and expanding in the values of the compiler variables $Inc, $Class, etc. at the indicated places. For FunctionalTest.ph, it creates the following C++ header file FunctionalTest.h for the FunctionalTest class. [0577]
     1 #line 7 “./FunctionalTest.ph”
     2 #include <ITest.h>
     3 #line 5 “./FunctionalTest.ph”
     4 #include <Test1.h>
     5 #line 6 “./FunctionalTest.ph”
     6 #include <Test2.h>
     7 #line 55 “./FunctionalTest.ph”
     8 #include <vector>
     9 #line 55 “./FunctionalTest.ph”
    10 #include <Levels.h>
    11 #line 55 “./FunctionaITest.ph”
    12 #include <TestCondnGrp.h>
    13 ...
    14 #line 56 “./FunctionalTest.ph”
    15 namespace
    16 {
    17 #line 7 “./FunctionalTest.ph”
    18 class FunctionalTest : public ITest,
    19 #line 8 “./FunctionalTest.ph”
    20 public Test 1,
    21 #line 8 “./FunctionaITest.ph”
    22 public Test2
    23 #line 59 “./FunctionaITest.ph”
    24 {
    25 // Array types for parameters storage:
    26 #line 61 “./FunctionalTest.ph”
    27 public:
    28 #line 37 “./FunctionaITest.ph”
    29 typedef std::vector<Tester::TestCondition *>
    TestConditionPtrsAry_t;
    30 #line 62 “./FunctionalTest.ph”
    31 public:
    32 virtual void preExec( );
    33 virtual void exec( );
    34 virtual void postExec( );
    35 public:
    36 #line 7 “./FunctionalTest.ph”
    37 void setName(OFCString &name); # Automatic for all tests
    38 #line 22 “./FunctionalTest.ph”
    39 void setPatternTree(PatternTree *);
    40 #line 23 “./FunctionalTest.ph”
    41 String getPListParamDescription( ) const;
    42 #line 39 “./FunctionalTest.ph”
    43 void addTestCondition(TestCondition *);
    44 #line 40 “./FunctionalTest.ph”
    45 void getTestConditionParamDescriptionO const;
    46 #line 67 “./FunctionalTest.ph”
    47 ...
    48 private:
    49 double m_someVar;
    50 #line 70 “./FunctionalTest.ph”
    51 private:
    52 #line 7 “./FunctionalTest.ph”
    53 OFCString m_name; # Automatic for all tests
    54 #line 21 “./FunctionalTest.ph”
    55 Tester::PatternTree *m_pPatList;
    56 #line 38 “./FunctionalTest.ph”
    57 TestConditionPtrsAry_t m_testCondnsArray;
    58 #line 71 “./FunctionalTest.ph”
    59 ...
    60 };
    61 ...
    62 #line 7 “./FunctionalTest.ph”
    63 inline void
    64 #line 7 “./FunctionalTest.ph”
    65 FunctionalTest::setName(OFCString &name)
    66 #line 74 “./FunctionalTesth”
    67 {
    68 m_name = name;
    69 return;
    70 }
    71 #line 39 “./FunctionalTest.ph”
    72 inline void
    73 #line 39 “./FunctionalTest.ph”
    74 FunctionalTest::addTestCondition(TestCondition *arg)
    75 #line 74 “./FunctionalTest.ph”
    76 {
    77 m_testCondnsArray.push_back(arg);
    78 return;
    79 }
    80 #line 23 “./FunctionalTest.ph”
    81 inline void
    82 Tester::String FunctionalTest::getPListParamDescription( )
    83 {
    84 return “The PList parameter for a FunctionalTest”;
    85 }
    86 #line 40 “./FunctionalTest.ph”
    87 inline void
    88 Tester::String
    FunctionalTest::getTestConditionParamDescription( )
    89 {
    90 return “The TestCondition parameter for a FunctionalTest”;
    91 }
    92 #line 75 “./FunctionalTest.ph”
    93 } // End namespace
  • As described earlier, this pre-header enables the compiler to check the validity of a FunctionalTest declaration, to generate code for it, and to generate a C++ header that would be needed by it. [0578]
  • As an example, consider the FunctionalTest declaration given earlier, reproduced below for convenience: [0579]
    Test FunctionalTest FuncTest1
    {
    PListParam = patList1; # Previously defined pattern list
    TestConditionParam = TC1;
    TestConditionParam = TC2;
    }
  • The C++ header that would be generated for this by the compiler is given above. The compiler would generate the following code for the above FunctionalTest construct: [0580]
  • FunctionalTest FuncTest1; [0581]
  • FuncTest1.setName(“FuncTest1”); [0582]
  • FuncTest1.setPatternTree(&patList1); [0583]
  • FuncTest1.addTestCondition(&TC1); [0584]
  • FuncTest1.addTestCondition(&TC2); [0585]
  • Notice also the name that is generated for the Description function. Each parameter named Xxx is associated with a member function: [0586]
  • Status getXxxDescription( ) const; [0587]
  • that returns the string with a description for the tool tip that the GUI can use. [0588]
  • Other Pre-Header Features [0589]
  • The pre-header supports some other user defined enumerations as an additional type. This allows the GUI to provide a drop down list of possible choices that could be used for setting the value of a particular parameter. Furthermore, the pre-header provides a feature to associate a number of parameters that can be thought of as a table. For example, it may be convenient to implement an array of “properties” as an associated set of an array of strings for the names, and an array of integers for the values. One easy way of implementing this feature is to use an array of custom types (discussed later). However, that requires the user to write a custom type pre-header to use. Both of these features are illustrated in the following example: [0590]
    # ---------------------------------------------------------
    # File FooBarTest.ph
    #
    # Parameterization specification pre-header for
    # custom test class FoobarTest
    # ---------------------------------------------------------
    Version 1.0;
    Import Test1.ph; # For base class Test 1
    TestClass = FoobarTest; # The name of this test class
    PublicBases = Test1; # List of public base classes
    # The parameters list:
    Parameters
    {
    # An enumerated type
    Enum WishyWashy = Yes, Perhaps, Possibly, Maybe, MaybeNot,
    No;
    # Define a WishyWashy parameter.
    WishyWashy WW
    {
    Cardinality = 1;
    Attribute = m_ww;
    SetFunction = setWw;
    Description = “The WW parameter for a Foobar Test”;
    }
    # This class has an array of name-number pairs that is
    # interpreted in the class.
    ParamGroup
    {
    Cardinality = 0−n;
    # The Name field in this array is:
    #  - of type String
    #  - [represented by C++ type Tester::String]
    #  - stored in a member named m_NameArray
    #  - a function to set it named addName.
    #  - a parameter description for the GUI to use as a tool tip
    String Name
    {
    Attribute = m_NameArray;
    SetFuncti n = addName;
    Description = “A Name with a Value”;
    }
    # The Number field in this array is:
    #  - of type Integer
    #  - [represented by C++ type int]
    #  - stored in a member named m_NumberArray
    #  - a function to set it named addNumber.
    #  - a parameter description for the GUI to use as a tool tip
    Integer Number
    {
    Attribute = m_Number Array;
    SetFunction = addNumber,
    Description = “The value of the Name”;
    }
    }
    # The following declaration specifies that a FunctionalTest has
    #  - a parameter of type PList
    #  - [represented by C++ type Tester::PatternTree]
    #  - stored in a member named m_pPatList
    #  - a function to set it named setPatternTree.
    #  - a parameter description for the GUI to use as a tool tip
    PList PListParam
    {
    Cardinality = 1;
    Attribute = m_pPatList;
    SetFunction = setPatternTree;
    Description = “The PList parameter for a FunctionalTest”;
    }
    #
    # The following declaration specifies that a FunctionalTest has
    #  - 1 or more parameters of type TestCondition
    #  - [represented by C++ type Tester::TestCondition]
    #  - stored in a member named m_testCondnsArray
    #  - a function to set it named addTestCondition.
    # The [implement] clause causes the translation phase of to
    # generate a default implementation of this function.
    #
    TestCondition TestConditionParam
    {
    Cardinality = 1−n;
    Attribute = m_testCondnsArray;
    SetFunction = addTestCondition [Implement];
    Description = “The TestCondition parameter for a
    FunctionalTest”;
    }
    }
    CPlusPlusBegin
    $Inc
    namespace
    {
    class $Class
    {
    // Array types for parameters storage:
    $ParamAryTypes
    public:
    virtual void preExec();
    virtual void exec();
    virtual void postExec();
    $ParamFns
    // ...
    private:
    double m_someVar;
    $ParamAttrs
    // ...
    };
    // ...
    $ParamImpls
    } // End namespace
    CPlusPlusEnd
  • It must be noted that a custom type name-number pairs could have been declared, and a single array parameter of that custom type could have been used to have the same effect as the above ParamGroup of parameters. The technique presented above is a convenience that avoids the necessity of declaring a custom type. [0591]
  • C5. Custom Function Declarations [0592]
  • This allows the user to call custom functions when a flow transition takes place. Custom functions are declared through pre-header as follows: [0593]
    # ---------------------------------------------------------
    # File MyFunctions.ph
    #
    # Parameterization specification pre-header for MyFunctions
    # ---------------------------------------------------------
    Version 1.0;
    Functions = MyFunctions; # The name of this group of functions
    # Declare the following C++ function in the
    # MyFunctions namespace to determine the minimum
    # of two values.
    # // Return the minimum of x, y
    # double MyRoutines::Min
    # (ITestPlan* pITestPlan,int& x, int& y);
    Integer Min(Integer x, Integer y);
    # Declare the following C++ function in the
    # UserRoutines namespace to return the average of
    # an array.
    # // Return the average of the array
    # double MyRoutines::Avg
    # (ITestPlan* pITestPlan, double* a, const int a_size);
    # The C++ function will be called with a and a’Length
    Double Avg(Double a[ ]);
    # Declare the following C++ function in the
    # UserRoutines namespace to print the dut id
    # and a message
    # // Return the average of the array
    # double MyRoutines::Print
    # (ITestPlan* pITestPlan, String* msg, unsigned int&
    dutId);
    # The C++ function will be called with a and a’Length
    Void Print(String msg, UnsignedInteger dutId);
  • Typically a C++ section needs to be provided for the above declarations, as the compiler will expand these declarations in a standard way. The user is of course responsible for the C++ implementation of these functions. Note that all of the above functions will presumably take an ITestPlan pointer as an implicit first parameter. This pointer provides the function writer access to stateS in the TestPlan. For instance, the function writer could use the ITestPlan interface to access the current Flow, the current FlowItem in the flow, the current Result clause, values of UserVars, and other such information. Certain tester defined functions are available for use in the file Functions.ph: [0594]
    Version 1.2.3;
    #
    # File Functions.ph
    #
    Functions = Functions; # The name of this group of functions
    # Declare the following C++ function in the
    # Functions namespace
    # Returns the ID of the current DUT being tested by the
    # caller.
    UnsignedInteger GetDUTID( );
  • C++ for Custom Function Declarations [0595]
  • The C++ code that would be generated by compiler for MyFunctions above is to simply declare some functions in the MyFunctions namespace: [0596]
    namespace MyFunctions
    {
    double Min(ITestPlan* pITestPlan, int& x, int& y);
    double Avg(ITestPlan* pITestPlan, double* a, const int a_size);
    void Print(ITestPlan* pITestPlan, char* Msg, unsigned int dutID);
    }
  • These functions will be callable from a flow. [0597]
  • C6. Custom Flowables [0598]
  • It is also possible to create a pre-header implementing the C++ IFlowable interface using the pre-header. This enables a user to define custom flowables that can be run in a FlowItem. Shown below is a pre-header for the user-defined Flowable MyFlowable: [0599]
    # ---------------------------------------------------------
    # File MyFlowable.ph
    #
    # Parameterization specification pre-header for MyFlowable
    # ---------------------------------------------------------
    Version 1.2.4;
    FlowableClass = MyFlowable; # The name of this custom class
    # The parameters list:
    Parameters
    {
    # The following declaration specifies that a MyFlowable has
    # - 1 optional parameter Int1 of type Integer
    # - [represented by C++ type int]
    # - stored in a member named m_int1Val
    # - a function to set it named setInt1Val.
    Integer Int1
    {
    Cardinality = 0-1;
    Attribute = m_int1Val;
    SetFunction = setInt1Val;
    }
    # The following declaration specifies that a MyFlowable has
    # - 1 mandatory parameter Int2 of type Integer
    # - [represented by C++ type int]
    # - stored in a member named m_int2Val
    # - a function to set it named setInt2Val.
    Integer Int2
    {
    Cardinality = 1;
    Attribute = m_int2Val;
    SetFunction = setInt2Val;
    }
    # The following declaration specifies that a MyFlowable has
    # - one or more parameters of type String
    # - [represented by C++ type Tester::String]
    # - stored in a member named m_stringArrVal
    # - a function to set it named addStringVal.
    String StringItem
    {
    Cardinality = 1-n;
    Attribute = m_stringArrVal;
    SetFunction = addStringVal;
    }
    # The following declaration specifies that a MyFlowable has
    # - A single PList parameter
    # - [represented by the C++ type Tester::PList]
    # - stored in a member named m_plist
    # - a function to set it named setPListParam
    PList PListParam
    {
    Cardinality = 1;
    Attribute = m_plist;
    SetFunction = setPListParam;
    }
    }
    #
    # The section below is part of the Pre-Header which is an escape
    # into C++ code.
    #
    # Everything in this section will be reproduced verbatim in the
    # generated header file, except for “$Class”, “$Inc”,
    # “$ParamAryTypes”, “$ParamAttrs”, “$ParamFns” and
    “$ParamImpls”.
    #
    # Note that no comments beginning with the ‘#’ character are
    supported
    # within the following section.
    #
    CPlusPlusBegin
    $Inc
    namespace
    {
    class $Class
    {
    // Array types for parameters storage:
    $ParamAryTypes
    public:
    virtual void preExec( );
    virtual void exec( );
    virtual void postExec( );
    $ParamFns
    // ...
    private:
    double m_someVar;
    $ParamAttrs
    // ...
    };
    // ...
    $ParamImpls
    } // End namespace
    CPlusPlusEnd
  • There are several classes implementing the IFlowable interface. These include: [0600]
  • 1. Flows for program loading which will check whether a test plan can be executed within the current tester configuration. [0601]
  • 2. Flows for pattern loading which will load specific patterns and pattern lists. [0602]
  • 3. Flows for initialization which will put hardware and software in a known state, load global variables, and do other initialization and validation functions. [0603]
  • 4. Other generally useful test flows. [0604]
  • C7. Custom Types [0605]
  • The discussion on Test class parameterization earlier only allowed for test class parameters to be of known types, viz., elementary types and tester-defined types such as PLists, and TestConditions. For user flexibility, it is important to provide type extensibility, whereby types (that are unknown a-priori to the compiler) can be created and used. Custom types (CTs) will be defined in the Custom Types. These can be used to define types corresponding to C-language structs (also referred to as Plain Old Data types, or PODs, which are quite different from their namesakes in C++) as well as for types corresponding to C-language typedefs for function signatures. A separate file with user types will have the extension .ctyp. Here is an example of a user types declaration in accordance with the preferred embodiment of the present invention: [0606]
    #---------------------------------------------------------
    # File MyCustomTypes.ctyp
    #---------------------------------------------------------
    Version 1.0.0;
    CustomTypes
    {
    # A structured Plain-Old-Data type
    Pod Foo
    {
    String S1; # String is a standard type
    Integer I1; # ... and so is Integer
    String S2;
    }
    # Another structured type using Foo
    Pod Bar
    {
    Foo Foo1;
    String S1;
    Foo Foo2;
    }
    #
    # A pointer to a function.
    # Return type: Integer
    # Parameters: Integer, Integer
    #
    Routine BinaryOp(Integer, Integer) Returns Integer;
    #
    # Another pointer to a function.
    # Return type: Void
    # Parameter: Integer
    #
    Routine UnaryOp(Integer) Returns Void;
    #
    # A pointer to a function that takes
    # no parameters and does not return a value.
    #
    Routine NullaryOp( ) Returns Void;
    }
  • C++ for Custom Types [0607]
  • The CustomTypes declaration presented above will be translated by the compiler into the following C++ code: [0608]
    namespace CustomTypes
    {
    struct Foo
    {
    Tester::String S1;
    int I1;
    Tester::String S2
    };
    struct Bar
    {
    Foo Foo1
    Tester::String S1;
    Foo Foo2;
    };
    typedef int (*BinaryOp) (int&, int&);
    typedef void (*UnaryOp)(int);
    typedef void (*NullaryOp)( );
    }
  • Objects of these types can be passed to Test classes as parameters, as shown next. [0609]
  • Using Custom Types as Test Class Parameters [0610]
  • Consider the case where the user has an extension to a test, which needs to be initialized with—in addition to pattern lists and test conditions—other class objects, as well as arbitrary (i.e., user-defined) objects that are defined within a file containing Custom Types (i.e., a .ctyp file). For example, suppose the user wants to use the CTs defined in the file MyTestCTs.ctyp: [0611]
    # File MyTesetCTs.ctyp
    Version 1.0;
    CustomTypes
    {
    Pod Foo
    {
    String name;
    PList patternList;
    }
    Pod Bar
    {
    Foo someFoo;
    Double dVal;
    }
    Routine BinaryOp(Integer, Integer) return Integer;
    }
  • All that the user needs to do to use the above types is import the above file in his test class pre-header. Since the compiler interprets CTs that are so defined, the definitions for Foo and Bar are therefore available to it when it is processing the test class pre-header. Moreover, the compiler defines two C-language structs, struct Foo and Struct Bar, corresponding respectively to the types Foo and Bar above, the definitions for which are placed in the file myTestCTs.h. The Import statement for myTestCTs.ctt causes the file myTestCTs.h to be #include-d in the generated test class C++ header. The following example illustrates this process. First, consider the declaration for the test in the test plan (the declarations for pattern lists and test conditions have been omitted for clarity): [0612]
    ...
    Import MyFunctions.ph;
    Import MyCustomTypes.ctyp;
    ...
    # The CustomVars block defines variables of the Custom
    # types defined earlier.
    CustomVars
    {
    ...
    Bar bar1 =
    {
    { ”This is a Foo”, somePatList }, # someFoo
    3.14159 # dVal
    }
    #
    # A function object that is a binary operator.
    # The name on the right hand side of the assignment
    # is a routine declared in MyFunctions, for which,
    # of course, the user has to provide an implementation.
    #
    BinaryOp bop1 = MyFunctions.Min;
    }
    ...
    Test MyFancyTest MyTest1
    {
    ...
    BarParam = bar1;
    BinaryOpParam = bop1;
    }
    ...
  • In the above example, a CustomVars block is included in a test plan. A separate file with customization variables will have the extension .cvar. The user would write a pre-header for MyFancyTest that supports the above parameterization as follows (the parameterization declarations for pattern lists and test conditions have been omitted for clarity): [0613]
    # ---------------------------------------------------------
    # File MyFancyTest.ph
    #
    # Parameterization specification pre-header for MyFancyTest
    # ---------------------------------------------------------
    Version 1.0.2;
    Import MyCustomTypes.ctyp; # For CTs used in MyFancyTest
    Import FunctionalTest.ph; # For base class FunctionalTest
    TestClass = MyFancyTest; # The name of this test class
    PublicBases = FunctionalTest; # List of public base classes
    # The parameters list:
    Parameters
    {
    # The following declaration specifies that a MyFancyTest has
    # - an optional array of parameters of custom type Bar
    # - [represented by C++ type CustomTypes::Bar]
    # - stored in a member named m_barsArray
    # - a function to set it named addBarParam.
    # An implementation will be generated for addBarParam.
    Bar BarParam
    {
    Cardinality = 0-n;
    Attribute = m_barsArray;
    SetFunction = addBarParam [Implement];
    }
    # The following declaration specifies that a MyFancyTest has
    # - an optional parameter of custom type BinaryOp
    # - [represented by C++ type CustomTypes::BinaryOp]
    # - stored in a member named m_binaryOp
    # - a function to set it named setBinaryOpParam.
    # An implementation will be generated for setBinaryOpParam.
    BinaryOp BinaryOpParam
    {
    Cardinality = 0-1;
    Attribute = m_binaryOp;
    SetFuncti n = setBinaryOpParam [Implement];
    }
    }
    CPlusPlusBegin
    $Inc
    namespace
    {
    class $Class
    {
    $ParamAryTypes
    public:
    virtual void preExec( );
    virtual void exec( );
    virtual void postExec( );
    $ParamFns
    // ...
    private:
    double m_someVar;
    $ParamAttrs
    // ...
    };
    // ...
    $ParamImpls
    } // End namespace
    CPlusPlusEnd
  • C++ for Custom Test Classes using Custom Types [0614]
  • Finally, once the compiler has processed this pre-header file, it will create the following C++ header file for the MyFancyTest class, MyFancyTest.h: [0615]
    #include <MyCustomTypes.h>
    #include <ITest.h>
    #include <FunctionalTest.h>
    ...
    namespace
    {
    class MyFancyTest : public ITest,
    public FunctionalTest
    {
    public:
    typedef std::vector<CustomTypes::Bar *> BarAry_t;
    public:
    virtual void preExec( );
    virtual void exec( );
    virtual void postExec( );
    public:
    void setName(OFCString &name); # Automatic for all tests
    void setPatternTree(PatternTree *);
    void addTestCondition(TestCondition *);
    void addBarParam(CustomTypes::Bar *);
    void setBinaryOpParam(CustomTypes::BinaryOp *);
    ...
    private:
    double m_someVar;
    private:
    OFCString m_name; # Automatic for all tests
    PatternTree *m_pPatList;
    TestConditionPtrsAry_t m_testCondnsArray;
    BarAry_t m_barsArray;
    BinaryOp *m_binaryOp;
    ...
    }; // End class MyFancyTest
    ...
    inline void
    MyFancyTest::addBarParam(CustomTypes::Bar *arg)
    {
    m_barsArray.push_back(arg);
    return;
    }
    inline void
    MyFancyTest::setBinaryOpParam(CustomTypes::BinaryOp
    *arg)
    {
    m_binaryOp = arg;
    return;
    }
    } // End namespace
  • C8. Parameterization [0616]
  • As seen above, a pre-header for a Test class, custom Flowable class, or custom function definitions offers limited introspection into the class/functions through a parameterization specification section. The compiler uses this section to generate the parameterization interface for the class/function (and generate the class/function header itself). For Test classes and Flowable classes, it also uses this section to subsequently generate the calls in the Test Plan code to initialize an instance of that class. The following points concerning pre-headers and corresponding declaration should be noted: [0617]
  • 1. Every Test or custom Flowable class definition is preferably specified in a pre-header. The Parameters block in the pre-header is preferably the only place where the parameters list for such a class can be specified. (Thus, as a corollary, the “standard” parameters for a Test, such as pattern list and test condition specifications, also need to be included in the pre-header's Parameters block; this allows all parameters, standard and CTs, to be treated uniformly.) [0618]
  • 2. All parameters defined as non-optional (i.e., with a non-zero cardinality) in the pre-header for a Test or Flowable class should be initialized in the Test block or Flowable block declaration for an instance of that class. [0619]
  • 3. The objects used for initialization of parameters in the Test/Flowable block should have been defined previously. [0620]
  • 4. The replacement indicators $Class, $Inc, $ParamAryTypes, $ParamFns, $ParamAttrs and $ParamImpls must appear at the exact locations within the user code section of the pre-header that the user intends the corresponding generated code to be inserted at in the generated class header file. These should appear exactly once, since specific code is generated for each. [0621]
  • 5. The name of a parameter specification in the Parameters block of the pre-header (such as PListParam, TestConditionParam or BarParam in the examples above) is the name of the parameter to be used in the declaration of an instance of that class. [0622]
  • 6. The following are the semantics of the descriptors used in a parameter specification: [0623]
  • a. Cardinality: This indicates the number of parameters of this type that will be supported. The following are the possible values in one embodiment: [0624]
  • i. 1: This parameter is mandatory, and should be specified exactly once. This parameter will be maintained as a pointer to an object of the type of the parameter. [0625]
  • ii 0-1: This parameter is optional; if specified, it must be specified only once. This parameter will be maintained as a pointer to an object of the type of the parameter. [0626]
  • iii 1-n: This parameter is mandatory. Moreover, multiple values can be specified for this. The values will be stored in the order of specification. [0627]
  • iv 0-n: This parameter is optional. Multiple values can be specified for this. The values will be stored in the order of specification. [0628]
  • Note that for ( ) and ( ) above, all specified values will be stored in an STL vector< >, templated on a pointer to the type of the parameter. The type of this vector will be defined and inserted at the point indicated by $ParamAryTypes. The access level for these type definitions is always public. [0629]
  • b. Attribute: The name of the C++ variable to use as the store for parameter value(s) of this type. The name will be reproduced verbatim, as a private data member of the C++ class, and must conform to the requirements for a C++ identifier. Note that the type of this attribute is: [0630]
  • i. A pointer to the type of the parameter, if only single values are permitted; [0631]
  • ii. An STL vector< >, templated on a pointer to the type of the parameter, if multiple values are permitted (see ( ) above). [0632]
  • Note that the attributes hold references to objects created and populated by the Test Plan, and do not own these objects. The lifetime of the objects are always managed by the Test Plan itself. [0633]
  • c. SetFunction: The name of the function to use for setting a value for this parameter. The following points should be noted: [0634]
  • i. The name will be reproduced verbatim, and hence, must conform to C++ language requirements. [0635]
  • ii. The access level of the function is always public. [0636]
  • iii. The return type is always void. [0637]
  • iv. The function always takes only a single argument, of type pointer-to-parameter-type. [0638]
  • Note that a value is always set singly; i.e., for parameters that allow specification of multiple values, the generated code in the Test Plan will call this function repeatedly, once for every value specified, each of which will be added to an STL vector (as described above). [0639]
  • The optional keyword “[implement]” following the function name indicates that a trivial implementation for this function will be made available as an inline method in the class header (inserted at the point indicated by $ParamImpls). Otherwise, the user is responsible for providing an implementation of the function. [0640]
  • d. Description: A string literal that is a tooltip which will be used by a GUI tool to provide help during runtime modification of this parameter. The C++ member function generated in the custom class for a parameter named Xxx will be [0641]
  • String getXxxDescription ( ) const; [0642]
  • The function will return the specified string. [0643]
  • Test Plan Example with Customization [0644]
  • Shown below is the test plan example embellished with some customization: [0645]
    # ---------------------------------------------------------
    # File MyCustomizedTestPlan.tpl
    # ---------------------------------------------------------
    Version 0.1;
    #
    # Imports as before ...
    # The following import is implicit, but can be explicitly
    # provided.
    Import FunctionalTest.ph;
    # Import for MyFlowables, MyFunctions and Functions
    Import MyFlowables.ph;
    Import MyFunctions.ph;
    Import Functions.ph;
    #---------------------------------------------------------
    # Start of the test plan
    #---------------------------------------------------------
    TestPlan Sample;
    # This block defines Pattern Lists file-qualified names and
    # Pattern List variables that are used in Test declarations.
    # The file-qualified names refer to pattern lists in the named
    # files. The variables refer to String variables which will
    # hold the pattern list names at run time. User defined Flowable
    # objects could set the values of these variables through an
    # API.
    PListDefs
    {
    # File qualified pattern list names
    pl1A.plist:pat1Alist,
    pl2A.plist:pat2AList,
    # Pattern list variables
    plistXxx,
    plistYyy,
    plistZzz
    }
    # SocketDef, UserVars declaration as before ...
    # Declarations of TestConditions TC1Min, TC1Typ, TC1Max,
    # TC2Min, TC2Typ, TC2Max as before ...
    #
    # Declare a FunctionalTest. “FunctionalTest” refers to a C++
    # test class that runs the test, and returns a 0, 1 or 2 as
    # a Result. The Test Condition Group TCG1 is selected with
    # the “min” selector by referring to the TC1Min TestCondition.
    #
    # Note that compiler can compile this because of the imported
    # FunctionalTest.ph file.
    #
    Test FunctionalTest MyFunctionalTest1Min
    {
    PListParam = pat1AList;
    TestConditionParam = TC1Min;
    }
    #
    # Additional FunctionalTest declarations for the following, as before
    # MyFunctionalTest1Typ
    # MyFunctionalTest1Max
    # MyFunctionalTest2Min
    # MyFunctionalTest2Typ
    # MyFunctionalTest2Max
    #
    # Here is a declaration of MyFlowable. It uses a PatternList variable
    # plistXxx which is initialized by the flowable prior to use here.
    #
    # Compiler can compile this because of the imported MyFlowables.ph
    file:
    Flowable MyFlowable MyFlowable1
    {
    Int1 = 10;
    Int2 = 20;
    StringItem = “Hello World”;
    PListParam = plistXxx;
    }
    # Counters for PassCount and FailCount as before ...
    # Flows as before. Flows FlowTest1 and FlowTest2 are
    # unchanged from the previous example.
    Flow FlowTest1
    {
    # ...
    }
    Flow FlowTest2
    {
    # ...
    }
    #
    # Now FlowMain, a main flow, can be presented. It
    # implements a finite state machine that calls FlowTest1
    # and FlowTest2 as below:
    # ------------------------------------
    # Result 0 Result 1
    # ------------------------------------
    # FlowMain_1 FlowMain_2 return 1
    # FlowMain_2 FlowMain_3 return 1
    # FlowMain_3 FlowMain_4 return 1
    # FlowMain_4 FlowMain_5 return 1
    # FlowMain_5 return 0 return 1
    #
    # Where the IFlowables run by each FlowItem are:
    # ------------------------------------------
    # FlowItem IFlowable that is run
    # ------------------------------------------
    # FlowMain_1 MyFlowable1
    # FlowMain_2 DatalogStartFlow
    # FlowMain_3 FlowTest1
    # FlowMain_4 FlowTest2
    # FlowMain_5 DatalogStopFlow
    #
    Flow FlowMain
    {
    #
    # The first declared flow is the initial flow to be
    # executed. It goes to FlowMain_InitializationFlow
    # on success, and returns 1 on failure.
    #
    FlowItem FlowMain_1 MyFlowable1
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    # A user function call
    MyFunctions.Print (“Passed MyFlowable1”,
    Functions.GetDUTID( ));
    GoToFlowMain_2;
    }
    Result 1
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    # A user function call
    MyFunctions.Print(“Failed MyFlowable1”,
    Functions.GetDUTID( ));
    SetBin SoftBins.“3GHzLeakage”;
    Return 1;
    }
    }
    #
    # Goes to FlowMain_3 on success
    # and returns 1 on failure.
    #
    FlowItem FlowMain_2 DatalogStartFlow
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    # A user function call
    MyFunctions.Print(“Passed DatalogStartFlow”,
    Functions.GetDUTID( ));
    GoToFlowMain_3;
    }
    Result 1
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    MyFunctions.Print(“FailedDatalogStartFlow”,
    Functions.GetDUTID( ));
    Return 1;
    }
    }
    # This FlowItem calls the previously defined FlowTest1
    FlowItem FlowMain_3 FlowTest1
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    # A user function call
    MyFunctions.Print(“Passed FlowTest1”,
    Functions.GetDUTID( ));
    GoTo FlowMain_4;
    }
    Result 1
    {
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    # A user function call
    MyFunctions.Print(“Failed FlowTest1”,
    Functions.GetDUTID( ));
    SetBin SoftBins.“3GHzCacheFail”;
    Return 1;
    }
    }
    # This FlowItem calls the previously defined FlowTest2
    FlowItem FlowMain_4 FlowTest2
    {
    Result 0
    {
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    # A user function call
    MyFunctions.Print(“PassedFlowTest2”,
    Functions.GetDUTID( ));
    GoTo FlowMain_5;
    }
    Result 1
    {
    # FlowTest1 passed, but FlowTest2 failed
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    # A user function call
    MyFunctions.Print(“Failed FlowTest2”,
    Functions.GetDUTID( ));
    SetBin SoftBins.“3GHzSBFTFail”;
    Return 1;
    }
    }
    FlowItem FlowMain_5 DatalogStopFlow
    {
    Result 0
    {
    # All Passed!
    Property PassFail = “Pass”;
    IncrementCounters PassCount;
    # A user function call
    MyFunctions.Print(“Passed all!”,
    Functions.GetDUTID( ));
    SetBin SoftBins.“3GHzAllPass”;
    Return 0;
    }
    Result 1
    {
    # FlowTest1 and FlowTest2 passed,
    # but DatalogStopFlow failed
    Property PassFail = “Fail”;
    IncrementCounters FailCount;
    # A user function call
    MyFunctions.Print(“Failed DatalogStopFlow”,
    Functions.GetDUTID( ));
    Return 1;
    }
    }
    }
  • The following points need to be noted about the above code: [0646]
  • 1. The PListDefs section here has some PList names and also some PList variables. The PList names are names that can directly be used in tests. The PList variables are variables which can be used in tests, and whose value is bound at runtime to actual PLists by code in a customized Flowable. [0647]
  • 2. The PListDefs section is optional. If not present, its contents will be inferred by compiler from the various Test declarations. If present, it must declare all of the used PList parameters of Tests, though it may declare more. [0648]
  • 3. A runtime API will be available to assign values to PList variables. The TestPlan class will have a function: [0649]
  • Status SetPListVariable(const Tester::String& varName, const Tester::String& fileQualifiedPListName); [0650]
  • The Flowable will be able to use the above function to bind a PListVariable to a particular PList. [0651]
  • 4. User functions and functions can be called in FlowItems just prior to a transition, which is either a transfer of control to another FlowItem, or a return. [0652]
  • C++ for User Function Calls [0653]
  • With the exception of invoking custom function calls in flows, C++ code that would be generated by the compiler has been shown for the various customization techniques presented earlier. User function calls in a FlowItem are preferably handled by an IUserCalls member of each Flow. Each Flow preferably has a member of the interface IUserCalls which exports a single virtual member function, as shown below: [0654]
    class IUserCalls
    {
    public:
    virtual void exec(const String& flowItemName,
    unsigned int result) = 0;
    };
  • When a Flow with user function calls is encountered, the Flow gets populated with an instance of a class that implements the above interface. For example, in FlowMain in the example in the flow will be populated with an instance of the following class: [0655]
    class FlowMain_UserCalls : public IUserCalls
    {
    public:
    virtual void exec(const String& flowItemName,
    unsigned int result)
    {
    if (flowItemName = = “FlowMain_1”)
    {
    // ...
    } else if (flowItemName = = “FlowMain_2”)
    {
    // ...
    } else if (flowItemName = = “FlowMain_3”)
    {
    switch (result)
    {
    case 0:
    MyFunctions::Print(“PassedFlowTest1”,
    Functions::GetDUTID( ));
    return;
    case 1:
    MyFunctions::Print(“FailedFlowTest1”,
    Functions::GetDUTID( ));
    return;
    default:
    return;
    }
    }
    else if (flowItemName = = “FlowMain_4”)
    {
    // ...
    }
    else if (flowItemName = = “FlowMain_5”)
    {
    // ...
    }
    }
    };
  • The Flowltem::execute( ) operation knows the name of the flow item. Before it returns with the pointer to the next flow, it will call IUserCalls::exec( ) for the enclosing flow, passing its own flow item name, and the value of the current result. This will cause the above code to be executed, invoking the needed user defined functions. [0656]
  • C9. Test Program Compilation [0657]
  • As explained above, the Test Plan description file specifies the objects used in a test plan and their relationships to one another. In one embodiment, this file is translated to the C++ code that will be executed on the Site Controller in the form of an implementation of a standard interface ITestPlan. This code can be packaged into a Windows dynamic link library (DLL) which can be loaded onto the Site Controller. The Test Program DLL is generated to have standard known entry points that the Site Controller software can use to generate and return the TestPlan object it contains. [0658]
  • Construction from a Test Plan Description [0659]
  • The process of conversion from a test plan description to an implementation of ITestPlan is accomplished by the [0660] test program compiler 400. This process occurs in two phases: translation and compilation.
  • In the [0661] translation phase 402, the compiler 400 processes a test plan file (and the various other files it imports), as well as the pre-headers for all the test types used in the test plan. In this phase, it creates the C++ code for the Test Plan object and the C++ headers for the test types encountered, along with all other supporting files, such as MSVC++(Microsoft Visual C++) workspace and project files, DLL “boilerplate” code, etc. The compiler 400 inserts file and line directives into the generated code to ensure that compile-time error messages refer back to the appropriate location in the description file instead of pointing into the generated code.
  • In the compilation phase, which occurs after the compiler has created the necessary files, a [0662] standard compiler 404, such as an MSVC++ compiler, is invoked to compile the files and link them into a DLL.
  • The compiler takes, as input, a valid test plan file (and all related files), and generates, as necessary, a TestPlan file and all other files represented by “Import” directives in the test plan file. In addition, it generates a MSVC++ “Solution” to build the Test Plan DLL. For example, if the main file (MyTestPlan.tpl) included Timing1.tim to incorporate timing information, then the compiler would create (among others) the following files: [0663]
  • MyTestPlan.h [0664]
  • MyTestPlan.cpp [0665]
  • Timing1.cpp [0666]
  • MyTestPlan.sln (MSVC++ “Solution” file) [0667]
  • MyTestPlan.vcproj (MSVC++ “Project” file) [0668]
  • After all files are created (or updated), the compiler invokes the MSVC++ application, specifying the “Solution” it created, and builds the DLL. Any errors and/or warnings would be shown to the user. [0669]
  • If, after building the Test Plan, the user made a change to Timing1.tim, the user would then invoke the compiler, passing it MyTestPlan.tpl. The compiler would recognize (by timestamp information) that the main test plan file is unchanged, so that MyTestPlan.h/.cpp would not be recreated. However, while processing the main test plan file, it would see that the Timing.tim file has changed. Therefore, it would recreate the Timing1.cpp file, and invoke the MSVC++ application to rebuild the DLL. This avoids recompiling MyTestPlan.cpp, and only compiles Timing1.cpp and re-links the DLL. This approach will be especially useful in cutting down re-compile and re-link times for large test plans that take a significant amount of time to compile. [0670]
  • D. Running the Test Program [0671]
  • The Site Controller software loads the Test Program DLL into its process space and calls a “factory” function within the DLL to create an instance of the Test Plan object. Once the Test Plan object has been created, the Site Controller software can then execute the test plan or interact with it in any other way necessary. [0672]
  • Non-Interactive Builds [0673]
  • To most C++ software developers in the Windows environment building an application (or a DLL, or Library, etc) means bringing up a development environment (MS Visual C++, Borland C++, or similar), editing code, and (often) pressing a button to build the product. [0674]
  • The test environment of an embodiment of the invention will have a similar set of activities. Test Plan developers will need to edit code and build their Test Plans. However, tester will not require the Test Plan developer to bring up a C++ development environment in order to produce the resulting Test Plan DLL. [0675]
  • In order to accomplish this the present invention employs the concept of a non-interactive build. A non-interactive build is defined as a build that uses MS Visual C++ in a non-interactive mode. Note that this still allows other tools to be used interactively to manage such a build. The only implication is that Visual C++ is used non-interactively. [0676]
  • Assumed Environment [0677]
  • Certain assumptions are made about the user's environment. The assumptions are: [0678]
  • 1. The Test Plan developer will be developing his Test Plan according to above methods and rules. [0679]
  • 2. The Test Plan developer may not have a expert level knowledge of C++. [0680]
  • 3. The Test Plan developer will have access to command-line tools or GUI tools to convert file(s) to a Test Plan DLL. [0681]
  • Building Applications Without Buttons [0682]
  • Working with MS Visual Studio non-interactively requires one of two approaches. The first (and simplest) is to use the command-line interface. The second (and more flexible) is to use the Automation interface. This section describes both approaches. [0683]
  • Creating the Project [0684]
  • In order to use Visual Studio non-interactively one should start with a working Solution which contains one or more valid Projects. Unfortunately, this is the one task that cannot be accomplished from either a command-line or Automation approach. Neither method provides a mechanism for project creation. However, projects and solutions for Visual Studio can be created from a template. Therefore, given a project name and a template to start from we can create a solution/project for Visual Studio. [0685]
  • Populating the Project [0686]
  • Adding new files to the produced project uses the Visual Studio Automation model since the command-line does not support this. We provides two Visual Studio macros to add new and existing files to a project. Similar code could be used by an external script using an ActiveScript Engine (such as VBScript, JScript, ActivePerl, ActivePython, etc) to perform the same tasks. Therefore, our code generation tools could create new files and, using the Automation Model, add them to the existing Visual Studio project. After the files are created they can be updated as necessary by the tools. [0687]
  • Building the Project [0688]
  • Once we have a solution and project in place there are several options to using Visual Studio non-interactively to build the Test Plan. The simplest option is to invoke it from the command-line. Such a command-line would look like: [0689]
  • devenv solutionFile/build solutionCfg [0690]
  • where solutionFile is a Visual Studio solution file and solutionCfg is a specific configuration applicable to the projects within the solution. Another solution is to use the Visual Studio Object Model for Automation. This allows a finer grain of control over the build and configuration process. As mentioned above, it contains a listing of a Perl script to build a project from the command line. This program reads a configuration file which specifies projects and configurations to build (as well as other information about the projects) and builds them all using the Automation Model. Look at the uses of the $msdev object in this script for examples of how to use Automation objects in a script. [0691]
  • Debugger Support [0692]
  • In order for developers of Test classes to verify and debug their work, they need access to a debugger that allows them to break into the Site Controller and step through their code. Since the code generated by the compiler is C++ which is compiled by MSVC++, we use the MSVC++ debugger to debug Test class implementations. Note that this feature is meant only for Test class developers or others who work directly in C++. Other mechanisms will be provided to test engineers who wish to debug or step through the operation of a Test Program without referring directly to the generated C++ code. [0693]
  • System Software Environment [0694]
  • This section describes the general software environment for the Tester: the locations for the files required by user test plans, mechanisms for specifying alternate locations for such files, and the methods for specifying the locations of the test plans and module control software. [0695]
  • Environment Required by Test Plans [0696]
  • System standard locations, as well as the runtime configuration of the search paths for [0697]
  • 1. pattern lists, [0698]
  • 2. patterns, [0699]
  • 3. timing data, and [0700]
  • 4. test class DLLs [0701]
  • required by a test plan, may be configured by “environment” variables, as specified by environment configuration files. These are text files, with a simple syntax such as: [0702]
  • Tester_PATOBJ_PATH=“patterns\data;D:\projects\SC23\patterns\data”[0703]
  • The advantage of having such “environments” defined in text files instead of through native OS-supported environment variables is that the implementation is then not limited by the common restrictions that OS-supported environment variables have, such as maximum string lengths, etc. The following “environment” (setup) variables will be used for the entities listed above: [0704]
  • Pattern lists: Tester_PATLIST_PATH. [0705]
  • Pattern object files: Tester_PATOBJ_PATH. [0706]
  • Pattern source files: Tester_PATSRC_PATH (this is optional; please see). [0707]
  • Timing data files: Tester_TIMING_PATH. [0708]
  • Test class DLLs: Tester_TEST_CLASS_LIBPATH. [0709]
  • In order to support special cases, while maintaining useful default behavior, we provide three levels of configuration. These are described in increasing order of precedence: [0710]
  • First, a system environment setup file, $Tester_INSTALLATION_ROOT\cfg\setups\Setup.env, will specify the default values of “environment” variables. If no other configuration mechanism is available, this file will be required. In general, it will be available for all test plans run on the system. This file is created by the Installation and Configuration Management (ICM) system during installation, with input from the installer to assign the default values for the three variables mentioned above. (Note that besides the system defaults for the above three variables, this file will also contain the system defaults for certain other tester “environment” variables, as described in the following sub-section.) [0711]
  • Second, an environment setup file may be specified by the user as a runtime argument to the test plan. The variables in this runtime configuration will take precedence over default definitions. [0712]
  • Finally, a test plan may use a special block to specify the environment variables to be used in its execution. Variables defined in the test plan will take precedence over those in the default system file or the user-defined file. [0713]
  • In general, all necessary variables should be defined through one of the mechanisms described above. If a variable is not defined, a runtime error will occur. [0714]
  • Other Environment Setups [0715]
  • Besides the “environment” variables that are required by user test plans, the following two “environment” variables are required by the test environment: [0716]
  • 1. Tester_TEST_PLAN_LIBPATH: This specifies the search path that the System Controller will use for finding a user test plan DLL that should be loaded. Note that the same search path will also be used for finding user pin description and socket files. The default value for this variable, specified during installation time to the ICM, is stored by the ICM in the file $Tester_INSTALLATION_ROOT\cfg\setups\Setup.env. [0717]
  • 2. Tester_MODULE_LIBPATH: This specifies the search path that the system will use to load vendor-provided hardware module control software DLLs. This information, extracted from the Configuration Management Database (CMD), is also stored in the file $Tester_INSTALLATION_ROOT\cfg\setups\Setup.env by the ICM. [0718]
  • Note that while a user can override the value given in the Setup.env file for the Tester_TEST_PLAN_LIBPATH variable, the value given in the Setup.env file for the Tester_MODULE_LIBPATH should not be changed by the user unless the user wants to explicitly change the search path for the vendor-provided hardware module control software DLLs. [0719]
  • Search Path Specification Semantics [0720]
  • The following points should be noted about the “environment” variables that specify search paths: [0721]
  • 1. Each should be a semicolon(”;”)-separated list of directory names that the system will search to find a referenced file of a particular type. [0722]
  • 2. After initial system lookup of the value of such an “environment” variable, any changes made by the user to its value (for example, by editing an environment configuration file) will only be registered by the system when the user explicitly “informs” the system of the need to do so. [0723]
  • 3. Relative pathnames in the search paths will be interpreted as being relative to a particular setting of a related environment variable (that provides the functionality of defining a root), as paths relative to the “current working directory” (CWD) could lead to ambiguous results, since the notion of a CWD in a distributed environment—such as the one in which the tester works—might not be what the user intuitively expects it to be. This related environment variable, which designates the root that all relative pathnames in the search paths will be assumed to be relative to, is the “Tester_INSTALLATION_ROOT” variable, which gives the location of the top-level (i.e., “root”) directory of the tester installation on a user's system. [0724]
  • 4. The directory entries cannot contain the characters in the set [V:*?”<>|;]; note that except for the semicolon (“;”), all the other characters in this set are illegal in Windows file names. The semicolon (“;”) should not be used in search path entries, since it is used to demarcate entries in the search path. Note that pathnames can have embedded whitespaces, but all whitespaces occurring immediately before and after a pathname (i.e., before the first and after the last non-whitespace character in the pathname) will not be considered to be part of the pathname, and will be ignored. [0725]
  • 5. The search path directories will be searched in the order they are encountered in the definition. The first occurrence of a file will be the one chosen. [0726]
  • E. Test Patterns [0727]
  • The efficient management, handling and loading of a very large set of test pattern files is an important architectural aspect of the framework of an embodiment of the invention. The idea of hierarchical pattern lists is regarded as being an effective tool in providing tractable conceptualization and ease of use of the system to the end user. [0728]
  • The stimulus to a DUT is made available to the test system through test vectors. Vectors can generally be categorized as sequential (or linear), scan or Algorithmic Pattern Generator (APG)-derived. In the system of an embodiment of the invention, test vectors are organized in terms of patterns that are applied to the DUT at test time. A pattern is represented by a Pattern object in the user's test program. In the system, patterns are organized in pattern lists, represented programmatically by pattern list objects. A Pattern List object represents an ordered list of patterns or other pattern lists. The ordering is implicit in the order of declaration of the list components. Note that if only a single pattern is needed, it is required to be encapsulated in a list by itself. [0729]
  • A pattern list object in the user's test program is associated with a pattern listfile on disk, which contains the actual definition of the pattern list. The contents of a pattern list are thus dynamically determined by the contents of the associated disk file (more will be said about this later). [0730]
  • The definition of a pattern list provides an explicit name for the pattern list, and identifies an ordered list of patterns and/or other pattern lists through file name associations. It also provides for the specification of execution options, which will be described in detail after the pattern objects have been described, since the options can be applied to both pattern lists and patterns. The pattern list should follow the following rules: [0731]
    file-contents :
    version-info global-pattern-list-definitions
    version-info :
    Version version-identifier ;
    global-pattern-list-definitions :
    global-pattern-list-definition
    global-pattern-list-definitions global-pattern-list-definition
    global-pattern-list-definition :
    global-pattern-list-declaration { list-block }
    global-pattern-list-declaration :
    GlobalPList pattern-list-name optionsopt
    list-block :
    list-entry
    list-block list-entry
    list-entry :
    pattern-entry ;
    pattern-list-entry ;
    global-pattern-list-definition ;
    local-pattern-list-definition ;
    pattern-entry :
    Pat pattern-name optionsopt
    pattern-list-entry :
    PList pattern-list-reference optionsopt
    pattern-list-reference :
    pattern-list-qualified-name
    file-name ‘:’ pattern-list-qualified-name
    pattern-list-qualified-name :
    pattern-list-name
    pattern-list-qualified-name ‘.’ pattern-list-name
    local-pattern-list-definition :
    local-pattern-list-declaration { list-block }
    local-pattern-list-declaration :
    LocalPList pattern-list-name optionsopt
    options :
    option
    options option
    option :
    [ option-definition ]
    option-definition :
    option-name option-parametersopt
    option-parameters :
    option-parameter
    option-parameters ‘,’ option-parameter
  • The following are the descriptions of undefined non-terminals used above: [0732]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9.], where the first character must be a digit. [0733]
  • 2. name: A sequence of one or more characters from the set [a-zA-Z[0734] 0-9], where the first character must be from the set [a-zA-Z_].
  • 3. pattern-list-name: A sequence of one or more characters from the set [a-zA-Z[0735] 0-9], where the first character must be from the set [a-zA-Z_].
  • 4. file-name: A valid Windows file name (must be enclosed in double quotes if any white-spaces are contained in the file name). Note that this should be a simple file name, i.e., it should not have a directory component. A pattern-list-reference can be either internal referring to a pattern list in the same file, or external referring to one in another file. External references need to be qualified by a file-name. [0736]
  • 5. option-name: A sequence of one or more characters from the set [a-zA-Z[0737] 0-9], where the first character must be from the set [a-zA-Z_].
  • 6. option-parameter: A sequence of one or more characters from the set [a-zA-Z[0738] 0-9].
  • Pattern list files support comments, which are meant to be ignored by a pattern list file parser. Comments start with the ‘#’ character, and extend to the end of the line. [0739]
  • E1. Rules for Pattern List [0740]
  • The static or compile-time rules for pattern lists govern the declaration and resolution of names. Names in the pattern list language are declared by global-pattern-list-definitions and local-pattern-list-definitions. They are referenced by pattern-list-references. Below are some rules governing these declarations and references. [0741]
  • 1. A global-pattern-list-definition or a local-pattern-list-definition declares the name of a pattern list. A pattern-list-reference references the name of a declared pattern list. The names of global pattern lists are globally known. The names of local pattern lists are known only in the list-block in which they are declared. They can be referred to without qualification directly in that list block. In a more deeply nested declaration, a local pattern list will need to be referred to by a qualified name. [0742]
  • 2. Local pattern list names are known within the scope of an enclosing pattern list, and global pattern list names known within the scope of the system. For example: [0743]
    GlobalPList G1
    {
    LocalPList L1
    {
    LocalPList L2
    {
    ...
    }
    GlobalPList G2
    {
    ...
    }
    PList L2; # OK. Name L2 is known in this scope
    PList G2 # OK. Name G2 is global
    }
    PList L2; # Error. Name L2 is not known here.
    PList L1.L2; # OK. Name L1 is known here. L2 is known by
    # qualification.
    PList G1.L1.L2; # OK. Qualification by G1 is not needed but
    # is allowed.
    PList G2; # OK. Name G2 is global
    }
  • 3. Global pattern lists may be defined at an outermost level in a pattern list file, or may be defined as nested within an enclosing pattern list. The nesting is merely a convenience, however. They are conceptually defined as global pattern lists at the outermost level in the file. A nested global pattern list is semantically equivalent to an outermost (non-nested) global pattern list of the same name. So for example: [0744]
    GlobalPListG1
    {
    GlobalPList G2 ...
    }
    is semantically equivalent to:
    GlobalPList G1
    {
    PList G2; # References G2
    }
    GlobalPList G2 ...
  • 4. All global pattern lists are uniquely named. [0745]
    GlobalPList G1
    {
    # Note that this is as if declared at the outermost level
    # with a reference to it right here.
    GlobalPList G2
    {
    ...
    }
    }
    # This declaration will be an error in this or any other
    file,
    # as the name G2 is already taken.
    GlobalPList G2 # Error. Global name G2 is taken.
    {
    ...
    }
  • 5. Local pattern lists are always have their definitions nested within an enclosing pattern list which also determines the scope of the name of the local pattern list. Local pattern lists are uniquely named within their enclosing pattern list. Local pattern lists are syntactically disallowed from occurring at the outermost level in a pattern list file. [0746]
    GlobalPList G1
    {
    LocalPList L1
    {
    }
    LocalPList L2
    {
    LocalPList L1 # OK. No local name L1 is declared
    directly
    # in the enclosing scope defined by L2.
    {
    }
    PList L1 ; # OK. Refers to L1 declared in L2
    PList G1.L1; # OK. Refers to L1 declared in G1.
    }
    # Error. Redeclaring name L1 when the enclosing
    scope
    # defined by G1 already has an L1 declared in it.
    LocalPListL1;
    {
    }
    }
  • 6. Each pattern list file contains the definition for one or more global pattern lists. This follows directly from the syntax. The outermost level is a global-pattern-list-definition, and there must be at least one of them. [0747]
  • 7. The pattern-name is a reference to a pattern, following the Pat keyword. It references a pattern that is in a pattern file whose name is obtained by concatenating a suffix pat to the pattern name. The file denotes a file that will be obtained along a search path defined for patterns. [0748]
  • 8. A pattern-list-reference is a reference to a pattern list following the PList keyword. The reference consists of an optional filename followed by a qualified pattern list name which is just a list of names separated by dots. So, for instance, the following could be a pattern-list-reference: [0749]
  • PList foo.plist:G1.L1.L2.L3; [0750]
  • referring to a local pattern list L3 nested in L2 nested in L1 nested in a global pattern list G1 that is in a file foo.plist. The leftmost name segment in the above name is G1. [0751]
  • The leftmost name segment must resolve to either a global pattern list, or else to a local pattern list that is visible from the point of reference. [0752]
  • Name resolution of a pattern-list-reference proceeds as follows: [0753]
  • 1. Each name segment resolves to a name declared in the context of the prefix before it. [0754]
  • 2. If there is a file qualification, the leftmost name segment resolves to a global pattern list declared in the named file. [0755]
  • 3. If there is no file qualification, the leftmost name could resolve to a local pattern list within the enclosing scope and if that fails then the next enclosing scope, and so on, up to an enclosing global scope. [0756]
  • 4. Limiting the searching of scopes to the closest enclosing global scope is needed in order to preserve the semantics of global scopes as if they were declared at the outermost level in the pattern list file. If the nested global scope was (equivalently) textually declared at the outermost level, the name resolution search would terminate after examining its scope. [0757]
  • 5. If the reference has not been resolved by the prior steps, then the leftmost name segment can be resolved to a global pattern list within this same file. [0758]
  • 6. If the reference has not been resolved by the prior steps, then the leftmost name segment can be resolved to a global pattern list named in the file by adding the .plist suffix to the leftmost name segment. [0759]
  • 7. If the reference has not been resolved by the prior steps, then the reference is in error. [0760]
  • As mentioned earlier, the above rules dictate that the leftmost name segment resolves to either a local pattern list that is visible from the point of reference, or else to a global pattern list. [0761]
  • The following example illustrates some of these ideas. [0762]
    GlobalPlistG1
    {
    PList G3; # OK. Refers to a pattern list later in this
    file.
    PList G4; # OK. Refers to a pattern list in file
    “G4.plist”
    # OK. Refers to G1 in the file “my_plists.plist”.
    PList my_plists.plist:G1;
    # OK. Refers to a pattern list in file “my_plists.plist”.
    The
    # qualified name refers to a local pattern list named L2
    declared
    # in the scope of a local pattern list named L1 declared
    in the
    # scope of a global pattern list named G1.
    PList my_plists.plist:G1.L1.L2;
    LocalPList L1
    {
    LocalPList L2
    {
    }
    }
    PList L1; # OK. Refers to L1 declared in the
    # enclosing scope of G1
    }
    GlobalPlist G2
    {
    LocalPList L2
    {
    }
    GlobalPList G3
    {
    LocalPList L3
    {
    }
    PList L1; # Error. No L1 declared in this or any enclosing
    # scope;
    # Error. The name L2 is not declared in this scope. Also
    # though L2 is declared in the enclosing scope, this scope
    # is global, and so no further enclosing scope is examined.
    #
    # Contrast with reference to name L2 in LocalPList L3 below.
    PList L2;
    PList G1.L1; # OK. Refers to L1 in G1.
    # Error. G3 is not really nested inside G1. Since G3
    # is global, it is really declared at an outermost level,
    # and so G1.G3 is meaningless.
    PList G2.G3.L3;
    }
    LocalPList L3
    {
    # OK. Refers to G2.L2. The enclosing global scope is G2
    # and the name L2 is declared in G2.
    PList L2;
    }
    }
  • All pattern list file names and pattern file names are required to be unique across the test plan using them. [0763]
  • A pattern list reference can refer to a pattern list defined either before or after the reference in the same file. [0764]
  • Recursive and mutually recursive pattern list definitions are not permitted. While there is nothing in the pattern list file syntax to prevent the user from creating such definitions, the parser will flag an error when it detects such conditions. Note that there is some cost associated with the detection of such conditions. The user will be able to switch off the check if s/he can assume the responsibility of guaranteeing that the input space is free from mutually recursive definitions. [0765]
    GlobalPList G1
    {
    LocalPList L2
    {
    LocalPList L3
    {
    # Error. L2 runs L3 which runs L2.
    # This is a recursive reference to L2
    PList L2;
    PList G2;
    }
    }
    }
    GlobalPList G2
    {
    # Error. G1.L2 runs L3 which runs G2 which runs
    G1.L2.
    # This is a mutually recursive reference to G1.L2.
    PList G1.L2;
    }
  • The syntactic description of patterns and pattern lists allows for options to be specified on them. In general options are vendor specific. The syntax allows for any pattern or pattern list to have a number of options specified, each with a number of parameters. In we describe some supported options that will be recognized by most vendors. [0766]
  • The dynamic (i.e., execution) semantics of pattern trees is described in after defining a pattern execution sequence. [0767]
  • E2. Patterns [0768]
  • FIG. 6 illustrates a [0769] pattern compiler 602 and a pattern loader 604 according to an embodiment of the present invention. The user-defined contents of a pattern are available in a pattern source file 606, which is a plain text file. A pattern compiler will be responsible for compiling a source file into a module-specific format suitable for loading on the tester hardware; this latter file will be referred to as the pattern object file. The following are the general attributes:
  • 1. A Pattern object is not creatable by the user; rather, the user always deals with pattern lists, which are collections of other pattern lists and/or patterns. A pattern list object creates, owns and maintains the pattern objects contained within it, while making them accessible to the user if necessary. [0770]
  • 2. A pattern is uniquely named within a test plan, i.e., no two patterns within the test plan. can have the same name. The name of a pattern is distinct from the name of the file containing it. The pattern file name is the one used in the pattern list file to refer to a pattern, while the actual name of the pattern is defined in the pattern file. [0771]
  • In an embodiment of the invention, in general, a single DUT (device-under-test) might be connected to tester modules from different vendors. This has implications for the entire pattern compile-load-execute chain. The main ones are described in this section. [0772]
  • E3. Pattern Compilation [0773]
  • A [0774] pattern compiler 602 thus needs to target a specific site configuration (in terms of the vendor-specific digital modules used). For the rest of this discussion, the term “module” will be used to refer to a digital module, as an example. In order to allow the integration of modules 608 from different vendors into the system, the following procedures are preferred:
  • 1. Each module vendor will be responsible for providing its own module-[0775] specific pattern compiler 610, in the form of a dynamically loadable library or separate executable. This compiler library/executable will provide, at the very least, a well-known compile( ) function that takes as arguments
  • a. an array of (one or more) pattern source file pathnames, [0776]
  • b. the Pin Description file name, [0777]
  • c. the Socket file name, [0778]
  • d. an optional directory pathname specifying the destination of the compiled object, [0779]
  • e. an optional array of string name/value pairs that allow the specification of any vendor-specific parameters (that can be ignored by other vendors). [0780]
  • 2. The pattern source file will accommodate two different types of sections: [0781]
  • a. a “common” section that will contain information accessible to (but not necessarily used by) all compilers, and [0782]
  • b. one or more optional vendor-specific sections, each identified by unique vendor codes, for information usable by specific vendors' compilers. [0783]
  • 3. A vendor's compiler will not directly create a pattern object file. Instead, the tester will provide for a pattern object “metafile” [0784] 612, managed by an Object File Manager (OFM) 614, which is part of the pattern compiler. The pattern compiler may be located on the computer acting as the system controller, or offline, e.g., on a network to which the system controller is connected. The “pattern object file” referred to so far in abstract terms is actually this object metafile. The object metafile will be named the same as the pattern source file, with the source file extension replaced by the object file extension. The OFM will provide an application programming interface (APIs) to read and write this file. The object metafile will have provisions for storing
  • a. common header information, [0785]
  • b. module-specific header information, including information identifying the corresponding module and the location of pattern data for the module, [0786]
  • c. module-specific pattern data, organized as required by the module vendor, and capable of being interpreted by the module vendor. [0787]
  • The OFM APIs will allow a module vendor's compiler to write module-specific header information and data into the object metafile. Note that this layout of the object metafile allows the pattern data to be organized on a per-module basis, even in the case where two or more modules in the targeted site are identical. [0788]
  • Note that additional vendor-supplied configuration information might be needed by pattern compilers to facilitate the generation of module-specific hardware loading information that can take advantage of efficient data communications such as direct memory access (DMA). [0789]
  • E4. Pattern Load for a Module [0790]
  • Each module vendor will be responsible for providing its own [0791] pattern loading mechanism 615, following the general procedure. The pattern object metafile 612 of a module 608 stores module-specific data in different sections 616. The vendor implementation will use the OFM APIs for accessing the relevant module-specific sections from the pattern object metafile. The tester framework will be responsible for calling each module's load method in turn to load module-specific data to a module from the appropriate section of the metafile.
  • E5. Pattern Files [0792]
  • It is possible to have each compiler vendor specify entirely different plain text formats for patterns, which, in fact, might indeed be necessary in most cases. However, in general, for a cycle-based testing environment, where coherent and identical semantics across modules are necessary for every vector, a shared, generalized syntax for the pattern file is not only desirable, but may be necessary. This shared syntax is what will be specified for the “common” section in the pattern source file. In fact, for the majority of cases, it is envisioned that the “common” section is the only section (besides header information) that will be required in the pattern file, and every vendor's compiler will work with only that section. This section presents rules for the pattern file that all compilers should be able to interpret. The pattern file will be organized as follows: [0793]
    file_contents :
    version_info pattern_definitions
    version_info :
    Version version-identifier ‘;’
    pattern_definitions
    pattern_definition
    pattern_definitions pattern_definition
    pattern_definition :
    main_header ‘{’ main_section ‘}’
    main_header ‘{’main_section vendor_sections ‘}’
    subr_header ‘{’ subr_section ‘}’
    subr_header ‘{’ subr_section vendor _sections ‘}’
    main_header :
    MainPattern identifier
    main_section :
    CommonSection ‘{’ common_contents
    main_section_domains ‘}’
    common_contents :
    timing_reference timing _map_reference
    timing_reference :
    Timing file-name ‘;’
    timing_map_reference :
    TimingMap file-name ‘;’
    main_section_domains :
    main_section _domains main_section_domain
    main_section_domain
    main_section_domain :
    Domain domain_name ‘{’ main_section_contents ‘)’
    domain_name :
    identifier
    main_section_contents :
    main_section_contents main_section_content
    main_section_content
    main_section_content :
    label_spec main_pattern_spec
    main_pattern_spec
    label_spec :
    label ‘:’
    label :
    identifier
    main_pattern_spec :
    main_operation capture_mask_flag ‘{’
    vectors_and_waveforms ‘}’
    main_operation : /* empty */
    common_operation
    jal_op
    jsr_op
    jsrc_op
    jsc_op
    exit_op
    common_operation :
    idxi_op
    idxin_op
    jec_op
    jech_op
    jff_op
    jffi_op
    jni_op
    ldin_op
    nop_op
    pause_op
    sndc_op
    sndt_op
    stfi_op
    sti_op
    stps_op
    wait_op
    /*
     * Instructions specific to the MAIN Patterns
     */
    jsr_op :
    JSR identifier
    jsrc_op :
    JSRC identifier
    jsc_op :
    JSC identifier
    jal_op :
    JAL identifier
    exit_op :
    EXIT
    /*
     * Instructions common to both MAIN and SUBR Patterns
     */
    idxi_op :
    IDXI 24-bit number
    idxin_op :
    IDXIn index-register
    jec_op :
    JEC identifier
    jech_op :
    JECH identifier
    jff_op :
    JFF identifier
    jffi_op :
    JFFI identifier
    jni_op :
    JNI identifier
    ldin_op :
    LDIN index-register
    nop_op :
    NOP
    pause_op :
    PAUSE
    sndc_op :
    SNDC 8-bit number
    sndt_op :
    SNDT 8-bit number
    stfi_op :
    STFI 24-bit number
    sti_op :
    STI 24-bit number
    stps_op :
    STPS
    wait_op :
    WAIT
    capture_mask_flag : /* empty */
    capture _mask_flag CTV
    capture _mask_flag MTV
    capture _mask_flag MATCH
    vectors_and_waveforms : /* empty */
    vectors_and_waveforms vector
    vectors_and_waveforms waveform
    vector :
    vector_declaration ‘{’ vector_data ‘}’
    vector_declaration :
    Vector
    V
    vector_data :
    vector_datum
    vector_data vector_datum
    vector_datum :
    pin_name ‘=’ vector-value ‘;’
    pin_name ‘=’ identifier ‘;’
    waveform :
    waveform_declaration ‘{’waveform_data ‘}’
    waveform_declaration :
    Waveform
    W
    waveform_data :
    waveform_datum
    waveform_data waveform_datum
    waveform_datum
    waveform-table-pin-group-name ‘=’ identifier ‘;‘
    pin_name : :
    identifier
    vendor_sections
    vendor_sections vendor_section { }
    vendor_section { }
    vendor_section :
    VendorSection ‘{’ vendor_section_contents ’}’
    subr_header :
    SubrPattern
    subr_section :
    CommonSection ‘{’ common_contents
    source_selection_table subr_section_domains ‘}’
    CommonSection ‘{’ common_contents
    subr_section_domains ‘}’
    subr_section_domains :
    subr_section_domains subr_section_domain
    subr_section_domain
    subr_section_domain :
    Domain domain_name ‘{’ subr_section_contents ‘}’
    source_selection_table :
    SourceSelectionTable ‘{’
    source _selector_definitions ‘}’
    source_selector_definitions:
    source_selector_definitions
    source_selector_definition
    source_selector_definition
    source_selector_definition:
    SourceSelector source_selector_name ‘{’
    source_mappings ‘}’
    source_selector_name :
    identifier
    source_mappings :
    source_mappings source_mapping
    source_mapping
    source_mapping :
    pin_name ‘=’ source ‘;’
    source :
    MAIN
    INVERT_MAIN
    SUBR
    INVERT_SUBR
    subr_section_contents :
    subr_section_contents subr_section_content
    subr_section_content
    subr_section_content :
    label_spec subr_pattern_spec
    subr_pattern_spec
    subr_pattern_spec :
    subr_operation capture _mask_flag ‘[’
    vectors_and_waveforms ‘}’
    subr_operation : /* empty */
    common_operation
    rtn_op
    stss_op
    /*
     * Instructions specific to the SUBR Patterns
     */
    rtn_op :
    RTN
    stss_op :
    STSS identifier
  • The following are the descriptions of undefined non-terminals used above: [0794]
  • 1. version-identifier: A sequence of one or more characters from the set [0-9.], where the first character must be a digit. [0795]
  • 2. identifier: A sequence of one or more characters from the set [a-zA-Z[0796] 0-9], where the first character must be from the set [a-zA-Z_].
  • 3. vendor-section-contents: Arbitrary text that is meaningful only to a vendor-specific compiler. [0797]
  • 4. file-name: A valid Windows file name (must be enclosed in double quotes if any white-spaces are contained in the file name). Note that this should be a simple file name, i.e., it should not have a directory component. [0798]
  • 5. waveform-table-pin-group-name: A sequence of one or more characters from the set [a-zA-Z[0799] 0-9], where the first character must be from the set [a-zA-Z_]. This variable is declared elsewhere and holds the name of the waveform-table that is common to a group of pins.
  • 6. 24-bit number: A valid decimal number up to a maximum of 16777215. [0800]
  • 7. 8-bit number: A valid decimal number up to a maximum of 256. [0801]
  • 8. index-register: A valid decimal number. In one embodiment of a module this can have a value [1-8]. [0802]
  • 9. vector: This is similar to the Vector statement in STIL. Note that this refers to signal names and signal groups names, making it necessary for the compiler to have access to the Pin Description file. [0803]
  • 10. waveform-time-reference: A sequence of one or more characters from the set [a-zA-Z[0804] 0-9], where the first character must be from the set [a-zA-Z_].
  • Pattern files will support comments, which are meant to be ignored by a pattern file compiler. Comments will start with the ‘#’ character, and extend to the end of the line. [0805]
  • The following points should be noted with reference to the constructs in the pattern file's header and “common” sections: [0806]
  • 1. The pattern-name item specifies the name that will be associated with the Pattern object that the pattern file contains the data for. This gets carried over to the header in the corresponding pattern object metafile. [0807]
  • 2. The waveform-time-reference is the name for a particular waveform-and-timing definition that would be defined externally to the pattern file, in the Timing file. The specification of a waveform-time-reference in the pattern file would bind that particular name (for a waveform-and-timing) to all subsequent vectors, until another waveform-time-reference were encountered. [0808]
  • 3. The operand for a subroutine call (e.g., JSR and JSRC) is a string that should either be a pattern-spec label previously encountered in the same pattern file, or a pattern-spec label in an externally defined subroutine pattern. This operand will ultimately be resolved for the purposes of loading/handling subroutines. The labels for subroutine call operands are required to be unique across the system. [0809]
  • Note that while waveform-time-reference names could be anything that is syntactically correct, due to specific hardware implications the waveform-time-reference names may need to be restricted to a previously known, well-defined set (which, for added readability, can be optionally mapped by the user to user-chosen names, the mapping presented in an optional file). [0810]
  • Also note that the pattern and waveform-time-reference source files should provide initial configuration data for all DUT channels which have connections to physical tester channels. If subsequent data is omitted for any DUT channel, the pattern compiler will “pad” the pattern data to hold output from the initial level. [0811]
  • Pattern File Example [0812]
  • A simple example of a MAIN Pattern source file will help illustrate the usage. [0813]
    #
    # Filename : good1.pat
    #
    Version 1.0 ;
    # ----------------------------------------------------------------------
    # Main Pattern definition:
    # ----------------------------------------------------------------------
    MainPattern good1
    {
    CommonSection
    {
    MacroDef defaultDataVal (XXXXXXXX)
    MacroDef nopInstr (NOP)
    MacroDef label1 (Label1 : )
    MacroDef jniInst (JNI)
    # ------------------------------------------------------------------
    # Timing Specifications
    # ------------------------------------------------------------------
    Timing “productionTiming.tim”;
    TimingMap “productionTimingOpenSTARMap.tmap”;
    # ------------------------------------------------------------------
    # Default Domain Cycles
    # ------------------------------------------------------------------
    Domain default
    {
    # ----------------------------------------------------------------
    # label: instruction {Vector/Waveform Data}
    # ----------------------------------------------------------------
    NOP { V { DATA = $defaultDataVal; CLK = 1;}
    W { DATA = wfsl; CLK = wfsl; } }
    JAL myAPG { V { DATA = 00000000; } }
    JSC mySCAN { V { DATA = 10101010; } }
    JSRC mySubroutine { V { DATA = 01010101; } }
    JSR myAPG { V { DATA = 00110011; } }
    STI 100 { }
    labZero: NOP { V { DATA = 00000011; } }
    JNI labZero { V { DATA = 11111100; } }
    IDXI 3000 { V { DATA = 10101010; } }
    IDXIn 3 { V { DATA = 01010101; } }
    $label1 NOP { V { DATA = $defaultDataVal; } }
    IDXI 2000 { V { DATA = 10101010; } }
    NOP { }
    EXIT { V { DATA = LLHHLLHH; } }
    }
    }
    }
  • Another example illustrating a SUBROUTINE pattern source file is illustrated below. [0814]
    #--------------------------------------------------------------------
    # Subroutine Pattern mySubrPat1 definition:
    #--------------------------------------------------------------------
    SubrPattern mySubrPat1
    {
    CommonSection
    {
    #----------------------------------------------------------------
    # Timing Specifications
    #----------------------------------------------------------------
    Timing “productionTiming.tim”;
    TimingMap “productionTimingOpenSTARMap.tmap”;
    #----------------------------------------------------------------
    # Source Selection Specifications
    #----------------------------------------------------------------
    SourceSelectionTable
    {
    SourceSelector SrcSelDef
    {
    DATA=SUBR; CLK=SUBR; DATA=SUBR;
    }
    SourceSelector SrcSelOne
    {
    DATA=MAIN; CLK=MAIN;
    }
    }
    #----------------------------------------------------------------
    # Default Domain Cycles
    #----------------------------------------------------------------
    Domain default
    {
    #----------------------------------------------------------------
    #label : instruction { Vector and Waveform Data setups }
    #----------------------------------------------------------------
    STI 100 { Vector { DATA = 00000000; } }
    IDXI 3000 { Vector { DATA = 00001111; } }
    IDXIn 3 { Vector { DATA = 00110011; } }
    $label1 NOP { Vector { DATA = LLHHLLHH; } }
    NOP { Vector { DATA = LLXXXXXX; } }
    NOP { Vector { DATA = LLHHXXXX; } }
    JNI Label1 { Vector { DATA = LLHHLLHH; } }
    STSS SrcSelOne { Vector { DATA = LHLHLHLH; } }
    RTN { Vector { DATA = LLXXXXXX; } }
    }
    }
    }
  • Summary information from the main header and common section in the pattern source file is stored in the main header in the object metafile. The summary consists of information that is typically required for quick extraction to aid pre-load resolution of addresses, etc., or to aid in datalogging. Since the semantics of the common section are exactly the same for all compilers, every compiler will be capable of providing the same summary information, and the first compiler writing the metafile will store this information. The following is the information that will be stored: [0815]
  • 1. The pattern source file name. [0816]
  • 2. The type of the pattern as declared in the source file. [0817]
  • 3. The version information from the source file. [0818]
  • 4. A list of all the waveform-and-timing names used in the pattern source file's common section. [0819]
  • 5. A map of all subroutine references to (relative) vector addresses in the pattern source file's common section. [0820]
  • 6. A map of all label references to (relative) vector addresses in the pattern source file's common section. [0821]
  • 7. General bookkeeping information: vector count, instruction count, etc. [0822]
  • The open architecture test system requires both pattern and pattern list files to have explicit, and different, extensions. For pattern files, this applies to both plain text source and compiled object files. This is viewed as a convenience to the user to quickly identify the file type visually in a directory listing, etc., as well as allow associations to be made on the basis of extensions. The pattern list file parser will expect filenames with these extensions: [0823]
    Plain text pattern source file: .pat
    Compiled pattern object metafile: .pobj
    Pattern list file: .plst
  • The user can override these default values, e.g., through tester environment variables or setup options. [0824]
  • The tester will require the definition of the following “environment” variables for file search paths in at least one of the environment configuration files described in: [0825]
    Tester_PATLIST_PATH: For pattern list files.
    Tester_PATSRC_PATH: For pattern source files (optional).
    Tester_PATOBJ_PATH: For pattern object metafiles.
  • Note that if the optional environment/setup variable Tester_PATSRC_PATH is not defined, it will be assumed to be the same as Tester_PATOBJ_PATH. In general, it would be more efficient to not define Tester_PATSRC_PATH rather than define it with the same value as Tester_PATOBJ_PATH. [0826]
  • E6. Software Representation [0827]
  • A Pattern object is not created by the user; rather, the user always deals with Pattern List objects, which are collections of other pattern lists and/or patterns. A Pattern List object creates, owns and maintains the pattern objects contained within it, while making them accessible to the user. A pattern list object in the user's test program is associated with a pattern list file on disk, which contains the actual definition of the pattern list. The definition of a pattern list provides an explicit name for the pattern list, and identifies an ordered list of patterns and/or other pattern lists through file name associations. This section describes the software representation of pattern lists and patterns, as a prelude to understanding how they are manipulated in the tester framework. [0828]
  • Pattern List Associations [0829]
  • A single test site in the test system (and, by extension, the test plans in it) can be associated with multiple top-level pattern lists. However, there is only a single execution context for test plans at any given time. Since a top-level pattern list defines an execution sequence for the patterns referred to (hierarchically) by it, the active execution context is the one corresponding to the currently selected top-level pattern list. Note that this does not imply that only the patterns contained in a single pattern list can be loaded on the hardware at one time; rather, the set of patterns that are required to be loaded on the hardware to make an execution sequence viable must always be a subset of all the currently loaded patterns. [0830]
  • Pattern Trees [0831]
  • Intuitively, it is felt that a way to represent a top-level pattern list is by some sort of a tree data structure. FIG. 7 illustrates an embodiment of an ordered pattern tree of the invention, assuming that the pattern list A is the top-level pattern list [0832]
  • Pattern Tree Information Content [0833]
  • The following information will be stored at every node of the pattern tree: [0834]
  • 1. The name of the entity (pattern-list or pattern) associated with that node. [0835]
  • 2. The type of the definition source. For a leaf (pattern node), this will always be a pattern file; for an intermediate (pattern list) node, this could be either “top-level file” (for top-level pattern list definitions) or “embedded in file” (for nested pattern-list definitions). [0836]
  • 3. The last modification timestamp of the file on disk the node is associated with. [0837]
  • The following additional information will be stored only in intermediate (pattern list) nodes: [0838]
  • 1. Execution options (if any) set on the pattern-list object represented by that node—i.e., its object options. [0839]
  • 2. The execution options (if any), set on each child reference inside the pattern list definition represented by that node—i.e., the reference options, for each of its children. [0840]
  • Thus, the collection of nodes encountered on the unique path from the root to an intermediate node, and the sequence in which they are encountered, contain all the information necessary to determine the combined, effective, execution options represented by that node. The execution options of a pattern are determined by the effective execution options of its immediate parent, combined with the reference options its immediate parent might have for it. [0841]
  • It should be noted here that while the pattern list parser is in the process of creating the pattern tree, certain execution options might require initial storage of values simply as strings, since the context of their use might not be resolved until later. An example of such an option is a “mask” option, which specifies pin mask information: pattern lists are not associated with Socket information, and hence, pin mask options (pin and group names) are stored as strings, to be resolved prior to loading. [0842]
  • The following additional information will be stored only in leaf (pattern) nodes: [0843]
  • 1. All (possibly transitive) references to subroutines called by that pattern, both external and internal, organized as an execution tree. [0844]
  • Of course, all pattern nodes will additionally have access to—and might choose to cache—all the pattern file summary information available in the object metafile common header. [0845]
  • Handling Pattern List Modifications [0846]
  • Changes made to the contents of a pattern list conceptually affect all references to that pattern list. The following rules, which apply as appropriate to pattern objects as well as pattern list objects, will be used to manage such changes: [0847]
  • 1. A change made to the contents of a pattern list file on disk will be propagated through the test system only on a load( ) command being executed on that pattern list (or on any other pattern list that references that one). In other words, the pattern list hierarchy in software will always reflect the one currently loaded on the hardware. [0848]
  • 2. The user will be able to set a mode that will defeat the checks made during load time to synchronize pattern lists with their disk file sources; this will allow quicker/safer operation in production mode. [0849]
  • Pattern Tree Navigation [0850]
  • The top-level pattern lists associated with a test site (and, by extension, with a test plan for that site) have public (global) scope. The system provides APIs to navigate the pattern tree representing a top-level pattern list so that users can get access to individual nodes and sub-trees. [0851]
  • E7. Pattern List Dynamics [0852]
  • Earlier the static rules of Pattern Lists were described. A description of the dynamic (execution) rules of pattern lists is now presented. [0853]
  • The pattern tree is essential for general pattern management. For example, the starting point for a pattern load sequence is a call to the load( ) method on the pattern tree currently associated with the site or test plan. However, a pattern tree does not operate in isolation. A fully initialized pattern tree will be used to create the following two framework objects: [0854]
  • 1. A top-level pattern list defines a Pattern Execution Sequence for the patterns. It describes how such an execution sequence can be derived from the pattern tree corresponding to that top-level pattern list. For example, the pattern execution sequence corresponding to the pattern tree A shown in FIG. 7 is {q, s, t, q, r, q, u, u, v}. The Pattern Execution Sequence is conceptually an ordered list reflecting the execution sequence described through the pattern tree. The framework establishes and maintains any necessary navigation links between pattern tree nodes and corresponding entries in the Pattern Execution Sequence. [0855]
  • 2. The Pattern Set, which is simply a list of all the unique patterns (including subroutines) in the pattern tree. This is thus the list that will be used to determine the individual patterns that should be loaded on the hardware. The framework establishes and maintains any necessary navigation links between pattern tree nodes and corresponding entries in the Pattern Set. The Pattern Set for the pattern tree of FIG. 7 is (q, s, t, r, u, v) (it is assumed that none of the patterns in pattern list A contain any subroutine calls): [0856]
  • Note that both the Pattern Execution Sequence and the Pattern Set can always be derived from the pattern tree; however, it would often make sense to cache them, after initial construction, for as long was viable. [0857]
  • Pattern List Execution Options [0858]
  • As shown above, each pattern list declaration (preceding its definition) or pattern list/pattern reference entry can be followed by a number of execution options. Pattern list execution options modify the runtime execution of pattern lists. To allow future extensions, the names (and optional values) for these options will be treated simply as strings by the pattern list file parser of the pattern compiler, to be interpreted by a particular version as appropriate. Tester prescribes a set of options and their interpretations, described below. However, vendors can extend the set of options. In order to allow a parse-time validation of option syntax, the pattern list file parser could read an information file for a particular version. Such an information file could also be used to specify whether a particular version at all supports the specification of execution options. [0859]
  • For versions that support a set of execution options, the following general rules will govern their use. In order to understand these rules, it is useful to visualize the hierarchical collection of pattern lists/patterns as an ordered tree. [0860]
  • 1. Intrinsic options set on pattern list definitions (i.e., in the “local-pattern-list-declaration, global-pattern-list-declaration” productions in the file are, in effect, direct option settings on the corresponding Pattern List object in the user's test program. They thus apply to all references to that pattern list object, and are referred to as object options. [0861]
  • 2. Referential options set on references to pattern lists/patterns (i.e., in the “pattern-entry” and “pattern-list-entry” productions in the file limits the scope of the options to a specific path in the hierarchy—the path (established by the declaration order of pattern lists/patterns) that leads from the root of the tree to the reference under consideration. These are thus options on specific object references (and not on the objects themselves), and are referred to as reference options. [0862]
  • 3. The effective option settings for any list/pattern in the collection hierarchy (established by the declaration order of pattern lists/patterns) are a combination of the object and reference options encountered along the path from the root of the tree to that list/pattern. The specific combination mechanism (e.g., set union, set intersection, or any other conflict resolution algorithm) is a property of the option itself. [0863]
  • Note that a consequence of the above rules—and the fact that there is no facility to set execution options on a pattern definition in a pattern file—is that there is no direct rule to set options which apply to all references to a pattern. The mechanism for achieving this is to use a single-pattern pattern list. [0864]
  • The tester specifies a certain set of pattern list execution options that modify its burst behavior, and that modify its execution sequence. [0865]
  • When an execution sequence for a pattern list is submitted to the hardware, the hardware produces a burst. A Burst is the execution of a sequence of patterns directly by the hardware, without any involvement from the software. A Burst Discontinuity is a position in an execution sequence where a prior burst is terminated, and a new burst is started. [0866]
  • One of the objectives of the pattern management software is to provide the hardware with the execution sequences that it needs to produce a burst on. By default, a pattern tree yields an execution sequence, which if submitted to the hardware will result in a single burst. This behavior can however be modified by the use of options on the pattern list. Thus, the use of options result can result in burst discontinuities. [0867]
  • Furthermore, users will sometimes require a prologue or epilogue pattern to be run before or after every pattern or every burst. This modifies the execution sequence to be submitted to the hardware. [0868]
  • During the creation or modification of the Pattern Execution Sequence object, the framework has all the information necessary to determine, and report if required, breaks in pattern bursts resulting from the combination of execution options specified and the particular execution sequence embodied by the pattern tree. While doing this, it might need to investigate the hardware capabilities of the modules in the system. For example, one hardware implementation allows four stored configurations for pin masks, of which two (0 and 3) are used for default masked (to support Mask This Vector, MTV) and unmasked operation. The user is thus allowed two different global pin-mask configurations without breaking burst mode. [0869]
  • Note that if a module vendor does not support pattern list implementations in hardware, the vendor's processing of the Pattern Execution Sequence would result in individual execution of all patterns in the execution sequence. In both Site-Compatible and Site-Heterogeneous systems, the burst capability of sites would be limited by the “lowest common denominator”. The tester provides for a certain default set of options and their parameters is described below. Each option is specified by stating: [0870]
  • Whether it is Intrinsic (i.e. associated with a definition with the Global or Local keyword) or Referential (i.e. associated with a reference with the Pat or PList keyword). Intrinsic options apply at the point of definition and at every reference, but referential options apply only at the reference they are associated with. [0871]
  • Furthermore, an option is said to be Inherited by Children if the option is assumed to apply recursively to all statically (syntactically) or dynamically (semantically by being referenced) nested patterns or pattern lists. [0872]
  • Below is the list of options. Every compliant vendor will interpret these options as specified. [0873]
  • 1. Mask <pin/pin group>[0874]
  • Intrinsic when applied to GlobalPList, LocalPList [0875]
  • Referential when applied to PList, Pat. [0876]
  • Inherited by children. [0877]
  • This pattern list will always have the compare circuits of the pins referred to by the indicated pin or pin group disabled. Sometimes, hardware limitations may result in burst discontinuities. [0878]
  • 2. BurstOff [0879]
  • Intrinsic when applied to GlobalPList, LocalPList [0880]
  • Referential when applied to PList, Pat. [0881]
  • Not inherited by children. [0882]
  • This pattern list will always execute in the non-burst mode. This option is not inherited by children, but the BurstOffDeep option (below) is inherited by children. [0883]
  • 3. BurstOffDeep [0884]
  • Intrinsic when applied to GlobalPList, LocalPList [0885]
  • Referential when applied to PList, Pat. [0886]
  • Inherited by children. [0887]
  • This pattern list will always execute in the non-burst mode. This option is inherited by children, but the BurstOff option (above) is not inherited by children. Note that the BurstOffDeep option cannot be turned off by a child. [0888]
  • 4. PreBurst <pattern>[0889]
  • Intrinsic when applied to GlobalPList, LocalPList [0890]
  • Inherited only by child nodes having no burst options specified. [0891]
  • The indicated pattern is to be prefixed to all bursts within this pattern list. [0892]
  • The PreBurst pattern occurs just before every burst that is started due to this pattern list node. The option is not applied when already within a burst which has a PreBurst option that is the same pattern. [0893]
  • 5. PostBurst <pattern>[0894]
  • Intrinsic when applied to GlobalPList, LocalPList [0895]
  • Inherited only by child nodes having no burst options specified. [0896]
  • The indicated pattern is to be suffixed to all bursts within this pattern list. [0897]
  • The PostBurst pattern occurs just after every burst that is started due to this pattern list node. The option is not applied when already within a burst which has a PostBurst option that is the same pattern. [0898]
  • 6. PrePattern <pattern>[0899]
  • Intrinsic when applied to GlobalPList, LocalPList [0900]
  • Not inherited by children. [0901]
  • The indicated pattern is to prefixed to all patterns within this pattern list. [0902]
  • 7. PostPattern <pattern>[0903]
  • Intrinsic when applied to GlobalPList, LocalPList [0904]
  • Not inherited by children. [0905]
  • The indicated pattern is to be suffixed to all patterns within this pattern list. [0906]
  • 8. Alpg <alpg object name>[0907]
  • Intrinsic when applied to GlobalPList, LocalPList [0908]
  • Not inherited by children. [0909]
  • The named ALPG object stores relevant information such as slow speed APG register settings, read latency, immediate data registers, address scramble, data inversion, data generators, etc. [0910]
  • 9. StartPattern <pattern>[0911]
  • Intrinsic when applied to GlobalPList, LocalPList [0912]
  • Not inherited by children. [0913]
  • The pattern list will start executing at the first occurrence of the StartPattern in its execution sequence. [0914]
  • 10. StopPattern <pattern>[0915]
  • Intrinsic when applied to GlobalPList, LocalPList [0916]
  • Not inherited by children. [0917]
  • The pattern list will stop executing at the first occurrence of the StopPattern in its execution sequence. [0918]
  • 11. StartAddr <vector offset or label>[0919]
  • Intrinsic when applied to GlobalPList, LocalPList [0920]
  • Not inherited by children. [0921]
  • This must be accompanied by a StartPattern option. The pattern list will start executing at the StartAddr in the first occurrence of the StartPattern in its execution sequence. [0922]
  • 12. StopAddr <vector offset or label>[0923]
  • Intrinsic when applied to GlobalPList, LocalPList [0924]
  • Not inherited by children. [0925]
  • This must be accompanied by a StopPattern option. The pattern list will stop executing at the StopAddr in the first occurrence of the StopPattern in its execution sequence. [0926]
  • 13. EnableCompare_StartPattern <pattern>[0927]
  • Intrinsic when applied to GlobalPList, LocalPList [0928]
  • Not inherited by children. [0929]
  • Pattern comparison will commence at the first occurrence of the indicated pattern. [0930]
  • 14. EnableCompare_StartAddr, EnableCompare StartCycle [0931]
  • Intrinsic when applied to GlobalPList, LocalPList [0932]
  • Not inherited by children. [0933]
  • This must be accompanied with EnabelCompare_StartPattern. Indicates the address or cycle within the pattern where pattern comparison is to start. [0934]
  • 15. EnableCompare_StopPattern <pattern>[0935]
  • Intrinsic when applied to GlobalPList, LocalPList [0936]
  • Not inherited by children. [0937]
  • Pattern comparison will complete at the first occurrence of the indicated pattern. [0938]
  • 16. EnableCompare_StopAddr, EnableCompare_StopCycle [0939]
  • Intrinsic when applied to GlobalPList, LocalPList [0940]
  • Not inherited by children. [0941]
  • This must be accompanied with EnableCompare_StopPattern. Indicates the address or cycle within the pattern where pattern comparison is to complete. [0942]
  • 17. Skip. [0943]
  • Referential when applied to PList, Pat. [0944]
  • Not inherited by children. [0945]
  • Causes a pattern or the entire subsequence dominated by a pattern list to be skipped. This will also cause skipping of all options at the root of this pattern list sub-tree. It is as if this pattern sub-tree were not there for execution purposes. [0946]
  • Pattern List Burst Control [0947]
  • As described earlier, when an execution sequence for a pattern list is submitted to the hardware, the hardware produces a burst of a sequence of patterns, without any involvement from the software. A Burst Discontinuity is a position in an execution sequence where a prior burst is terminated, and a new burst is started. The PreBurst, PostBurst, BurstOff and BurstOffDeep options control where the burst discontinuities occur, as described in the option list above. PreBurst and PostBurst options determine burst discontinuities subject to certain additional rules described below: [0948]
  • 1. When a parent list has PreBurst and PostBurst options, and the nested list has the same corresponding options, there is no burst discontinuity, and the PreBurst and PostBurst options of the nested list do not apply. There is only a single burst applying the PreBurst and the PostBurst of the parent list. [0949]
  • 2. Notice that when the nested list has no burst options, it is equivalent to having the same PreBurst and PostBurst options as the parent list by the description of these options. Consequently, nested lists with no burst options do not result in a burst discontinuity. [0950]
  • 3. If [0951] rule 1 above does not apply and there is a contribution to the pattern execution sequence from the start of the parent list to the start of the nested list, then there is a burst discontinuity at the start of the nested list. In this case the PreBurst and PostBurst of the parent list apply to this contribution to the pattern execution sequence from the parent list. The PreBurst and the PostBurst of the nested list apply to the nested list.
  • 4. If [0952] rule 1 above does not apply, and there is a contribution to the pattern execution sequence from the end of the nested list to the end of the parent list, then there is a burst discontinuity at the end of the nested list. In this case the PreBurst and PostBurst of the parent list apply to this contribution to the pattern execution sequence from the parent list. The PreBurst and the PostBurst of the nested list apply to the nested list.
  • 5. If [0953] rule 1 does not apply, and there is no contribution to the pattern execution sequence from the parent list other than from the nested list, then the PreBurst and the PostBurst of the parent list do not apply. There is only a single burst applying the PreBurst and PostBurst of the nested list.
  • Below are a few examples illustrating the effect of options on the execution sequence. To simplify, it is assumed that all the pattern lists are specified in a single file. [0954]
  • EXAMPLE 1 Use of BurstOff
  • This example illustrates BurstOff and PreBurst. Of particular emphasis is that BurstOff causes patterns to run singly in bursts that are one pattern long. Hence the PreBurst option still applies. The input pattern lists are as below: [0955]
    Global A [BurstOff] [PreBurst pat_z]
    {
    Pat q;
    PList B;
    Pat r;
    Pat s;
    Global C
    {
    Pat t;
    Plist D;
    };
    Plist D;
    PList E;
    };
    Global B
    {
    Pat a;
    Pat b;
    };
    Global D [BurstOff]
    {
    Pat c;
    Pat d;
    };
    Global E
    {
    Pat e;
    };
  • The tree rooted at A may be represented in FIG. 8. [0956]
  • The execution sequence for this pattern is below. The | character indicates a burst break. This pattern list executes in 10 bursts, the first one having patterns z and q, and the last one with pattern e: [0957]
  • z q | a b | z r | z s | t | c | d | c | d | e [0958]
  • Note the following about this execution sequence: [0959]
  • 1. Since the BurstOff option on A is not inherited by B, the patterns a and b in B operate as a burst. [0960]
  • 2. Since the PreBurst option on A is not inherited by B, the a and b in the burst by B is not prefixed by z. [0961]
  • 3. The prefix by z only happens for the patterns that are executed due to being direct children of a, namely patterns q, r and s. These patterns are executed singly as if in a burst that is only one pattern long due to A having the BurstOff option. The BurstOff requires patterns to be run individually in one-pattern long bursts. Hence, the PreBurst and PostBurst options still apply. [0962]
  • 4. Pattern list D has an intrinsic burst off option that causes its children c and d to execute singly. They do not inherit the PreBurst z from A. [0963]
  • EXAMPLE 2 Use of BurstOffDeep
  • This example illustrates the BurstOffDeep option. BurstOffDeep during pattern list definition affects nested definitions and referenced lists. However, PreBurst and PostBurst options are not inherited by nested and referenced lists. The example uses the same patterns A, B, C, D, E as in example 1, but the options are different: [0964]
  • 5. Options on definition of A: [BurstOffDeep], [PreBurst z], [PostBurst y][0965]
  • 6. No other options on any other node. [0966]
  • The execution sequence is as below. As earlier, the | character indicates a burst break. [0967]
  • z q y | a | b | z r y | z s y | t | c | d | c | d | e [0968]
  • Note the following about this execution sequence: [0969]
  • 1. PreBurst and PostBurst are not inherited by B, C, D, E. [0970]
  • 2. BurstOffDeep is inherited by B, C, D, and E. [0971]
  • EXAMPLE 3 PreBurst and PostBurst Inhibition
  • Suppose now the pattern list tree of Example 1 is considered, where the options are: [0972]
  • 1. Options on definition of A: [PreBurst x] [PostBurst y][0973]
  • 2. Options on definition of C: [PreBurst x] [PostBurst z][0974]
  • 3. No other options on any other node. [0975]
  • The execution sequence would be: [0976]
  • x q a b r s t c d c d e y [0977]
  • The reasons why the “t c d” subsequence is not “x t c d z” are as follows: [0978]
  • 1. The first x is inhibited since it is equal to the pre-burst option x that is associated with the current burst in effect. [0979]
  • 2. The last z is inhibited since the PostBurst z is not inherited to D, and there is no pattern that is generated from C to which the z can be appended. [0980]
  • EXAMPLE 4 Use of Skip
  • This example illustrates the effect of the Skip option on nested definitions and referenced lists. The example uses the same patterns A, B, C, D, E as in example 1, but the options are different: [0981]
  • 1. Options on definition of A: [Skip], [PreBurst z], [PostBurst y][0982]
  • 2. Options on reference to r: [Skip][0983]
  • 3. Options on definition of C: [Skip][0984]
  • The execution sequence is a single burst with no breaks as below: [0985]
  • z q a b s c d e y [0986]
  • Note the following about this execution sequence: [0987]
  • 1. The nodes for r and C are skipped. [0988]
  • 2. There are no burst breaks at all. [0989]
  • EXAMPLE 5 Use of Mask
  • This example illustrates the effect of the Mask option and its effects on pattern and pattern list definitions and references. The example uses the same patterns A, B, C, D, E as in example 1, but the options are different: [0990]
  • 1. Options on definition of A: [mask pin1_pin2], [PreBurst z][0991]
  • 2. Options on reference of B: [mask pin3][0992]
  • 3. Options on definition of B: [mask pin4][0993]
  • 4. Options on reference of e: [mask pin5][0994]
  • 5. No other options on any nodes. [0995]
  • The name “pin1-pin2” specifies a group which masks Pin1 and Pin2. The names “pin3”, “pin4” and “pin5” specify masking Pin3, Pin4 and Pin5 respectively. The execution sequence is provided below, with | indicating the burst break. The numerals below each pattern indicate the pins that are masked during that pattern execution. [0996] z q a b z r z s t c d c d | e 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 5 4 4
    Figure US20040225459A1-20041111-M00001
  • Note the following about this execution sequence: [0997]
  • 1. The vendor's hardware can only accommodate [0998] 2 mask blocks without a burst break. Until e is executed the two mask blocks are pins {1, 2} and pins {1, 2, 3, 4}. When pattern e arrives with a different mask block of pins {1, 2, 5}, the hardware requires a burst break.
  • EXAMPLE 6 Use of Inherited Options and References
  • This example illustrates that an inherited option at a definition does not apply when the definition is referenced. Consider the following example: [0999]
    Global A
    {
    Global B [BurstOffDeep]
    {
    Global C
    {
    ...
    };
    ...
    };
    ...
    PList C;
    };
    Global D
    {
    PList C;
    };
  • The BurstOffDeep option is inherited by C at its point of definition. However, it is not an intrinsic option, and so it is not applied to C at both its point of references. [1000]
  • EXAMPLE 7 PreBurst and PostBurst with Nested Lists
  • Consider the following example: [1001]
    GlobalPList A [PreBurst x] [PostBurst y]
    {
    Pat p1;
    LocalPList B [PreBurst x] [PostBurst y]
    {
    Pat p2;
    }
    LocalPList C
    {
    Pat p3;
    }
    LocalPList D [PreBurst x] [PostBurst z]
    {
    Pat p4;
    }
    LocalPList E [PreBurst w] [PostBurst y]
    {
    Pat p5;
    }
    Pat p6;
    }
  • The execution sequence is: [1002]
  • x p1 p2 p3 y | x p4 z | w p5 y | x p6 y [1003]
  • 1. Pattern p2 is in the same burst as p1 because the PreBurst and PostBurst options of the nested list are specified the same as the parent. Pattern p3 is also in the same burst because these options are inherited the same as the parent. These options have at least one different member in the remaining nested lists, giving rise to burst discontinuities [1004]
  • Timing [1005]
  • The user interacts with the system primarily by defining the test setups using pattern files. The Timing File is used to describe the Timing of these patterns. This file requires other system files (e.g. Pin, SpecSelector) for underlying definitions to be resolved. Further the Spec-Selectors and Global definitions used to resolve various variables used in the Timing definition are encapsulated in a composite TestConditionGroup object. Higher-level files, such as the Test Plan file, in turn use this TestConditionGroup instance. [1006]
  • The Test Plan File contains references to the TestConditionGroup object. The Pattern Source File makes references to the WaveformSelector components within a TimingMap object. The Timing objects itself references the Pin objects. Optionally the Timing object might also reference a variable modulated by a SpecSelector object. These relationships are illustrated in FIG. 9. [1007]
  • The Pattern object within the Pattern-List specifies the name of the WaveformSelector object to use for a set of pattern characters. Also note that the Timing Map file is specified in the pattern. Patterns need not be compiled if this map is not changed. [1008]
    Figure US20040225459A1-20041111-C00001
  • The TestConditionGroup File objects import the Timing object to use and the TimingMap object to use. Each Test uses a TimingCondition instance derived from the TestConditionGroup object for that instance. Thus multiple Timing objects, which support the same set of waveform tables, can be stored in the tester framework and can be swapped as required. Similarly multiple Test Plan Files can share a common TestConditionGroup object. [1009]
  • An example of a Test Plan description file illustrates the usage of the Timing object below. [1010]
    Import patlist1.plist;
    Import tim1.tim;
    Import tim2.tim;
    Import tmap1.tmap;
    TestConditionGroup tim1_prod
    {
    SpecSet = prodTmgSpec(min, max, typ)
    {
    period = 10ns, 15ns, 12ns;
    }
    Timings
    Figure US20040225459A1-20041111-C00002
    TimingMap = tmap1;
    }
    }
    TestCondition tim1_prod_typ
    {
    TestConditionGroup = tim1_prod;
    Selector = typ;
    }
    TestCondition tim2_prod_max
    {
    TestConditionGroup = tim2_prod;
    Selector = max;
    }
    Test FunctionalTest MyFunctionalTestSlow
    {
    PListParam = patlist1;
    TestConditionParam = tim1_prod_type;
    }
    Test FunctionalTest MyFunctionalTestFast
    {
    PListParam = patList1;
    TestConditionParam = tim2_prod_max;
    }
  • The Timing object defines various waveforms on a per pin basis. The pins used in the Timing file and the Timing Map file need to be defined appropriately in the Pin definition file. [1011]
  • The Timing object can use SpecificationSet objects to define values within the waveform objects. Though the Timing object can include hard-coded values for various attributes it is usually the case that users have various attributes be assigned values using variables. These variables in turn can depend on SpecificationSet objects. An example of this usage is illustrated below. [1012]
    Figure US20040225459A1-20041111-C00003
    };
    };
    Pin CLK
    {
    WaveformTable wfs1
    {
    { 0 { U@20ns; D@40ns; } };
    };
    };
    }
  • The SpecSelector is defined as illustrated below. [1013]
    SpecificationSet prodTmgSpec( min, max, typ)
    {
    t_le = 10ns, 14ns, 12ns;
    t_te = 30ns, 34ns, 32ns;
    ...
    }
  • The changing of the timing used by changing the spec is illustrated in the example below. [1014]
    Figure US20040225459A1-20041111-C00004
    }
    TestConditionGroup prodTmp_max
    {
    Figure US20040225459A1-20041111-C00005
  • F2. Mapping to the Timing Components of a Tester [1015]
  • Two components of a tester module are directly involved with the generation of wave shapes and their associated timings. The two modules are the Pattern Generator (PG) and the Frame Processor (FP). A simplified block diagram illustrating the wave shape formatting and the timing generation by the Frame Processor within the open architecture test system architecture is illustrated in FIG. 10. A brief description of the generation of waveforms is given below. [1016]
  • The [1017] Pattern Generator 1002 generates a timing set which is common for all the pins in the module. This timing set is called the Global Timing Set (GTS). There are three modes in which the Pattern Generator can be set up. These three modes affect the number of bits that can be used to describe the GTS. In addition these settings also impact the number of bits used to select a bank and whether the Capture This Vector (CTV) and Mask This Vector (MTV) bits are set or not. To instruct the tester to capture the results of this vector, the user uses the CTV flag in the Pattern file. Similarly the user uses the MTV flag in the pattern to instruct the tester to mask the results of the current vector. This is illustrated in Table 1 below. The Pattern Generator 1002 is also responsible for the generation of Waveform Characters (WFC). WFCs are generated on a per pin basis. The tester module uses a fixed number of bits to describe the WFCs.
    TABLE 1
    GTS in a
    GTS bits Bank GTS Bank CTV MTV
    8 bits 256 4 NO NO
    7 bits 128 8 YES NO
    6 bits 64 16 YES YES
  • The tester module provides a [1018] Frame processor 1004 per pin. Each Frame Processor contains a Timing Set Scrambler (TSS) 1006, which has a total depth of up to 1024 in this example. The TSS 1006 can be partitioned into a number of banks 1008 depending on the mode of the Pattern Generator as described earlier and illustrated in FIG. 10 where 16 banks of 64 entries per bank are being used. The TSS is provided so as to allow more flexibility in the ability to define Waveform Tables for each pin. In the “FP” mode the TSS outputs a Timing Set using 2 bits. Thus the TSS will generate a total of four distinct physical Timing Sets per pin. These Timing Sets are referred to as the Local Timing Sets (LTSs).
  • The [1019] Frame Processor 1004 combines LTS and WFC and creates an index 1010 into the Waveform Memory 1012 and Timing Memory 1014. In the “FP” mode the 5-bit value is split up with 2 bits being generated by the LTS and 3 bits being generated by the WFC. Thus the depth of the physical Waveform Memory and Timing Memory is 32 deep per pin though a maximum of 4 physical Timing Sets may be used. The Waveform Memory contains the enabled timing edges that form the wave shapes. The timing values for the enabled edges are obtained from the Timing Memory, Thus, the Frame Processor formats wave shapes.
  • Mapping Methodology [1020]
  • The methodology is to map all the WaveformTable blocks on a per pin basis to LTSs in the tester. If tester hardware supports [1021] 4 LTSs, the user can define a maximum of 4 WaveformTable blocks. Each WaveformTable block can have a maximum of n waveform definitions for the tester digital module.
  • The Timing-Map file provides a mapping of Logical WaveformSelectors defined in the Timing-Map block to the WaveformTable for the module in open architecture test system. In this case the tester supports up to 256 Logical WaveformSelectors. In open architecture test system system, the Logical WaveformSelectors map directly to the GTSs. The Pattern compiler depends on both the Timing-Map and the Timing blocks to be able to compile the pattern files. However if the waveform characters in the WaveformTables of the Timing block are unchanged or the WaveformSelector mappings in the Timing-Map block are unchanged, there is no need to re-compile the pattern. [1022]
  • Example Using this Mapping Methodology [1023]
  • To illustrate the mapping into a tester Digital Module the following assumptions are made: the Frame Processor is set to the FP mode; and CTV and MTV bits are set so total number of GTS bits is 6 and the total number of Timing Bank Selector bits is 4. [1024]
  • Each WaveformTable defined in the Timing block is mapped to a distinct LTS within the Timing file. This is done on a per-pin basis. Thus WaveformTable seq1 is mapped to LTS1. In the case of the “SIG” pin all 8 possible waveform entries are used up. However the “CLK” pin requires a single waveform entry and thus uses up a single row in the Waveform memory (WFT) and the Waveform Timing memory (WTM). [1025]
  • The mapping of the first 2 physical waveforms of the “SIG” pin is illustrated in FIG. 11. As this WaveformTable maps two waveform characters that need separate configurations of the edges, we end up allocating two entries in the Waveform memory (WFT) [1026] 1112 and the Waveform Timing memory (WTM) 1114. The shape of the waveform is stored in the WFM and the timing details are stored in the WTM. One embodiment of the module has a total of 6 timing edges T1, T2, T3, T4, T5 and T6. These map directly to the Events E1, E2, . . . defined in the waveforms within a Edge Resource section of the Timing block. If more than 6 events are defined in the Timing block and this is used with a the above module, it will result in an error.
  • In the example of FIG. 11, the first waveform character “0” uses Timing Edge T1 to program the “Force Down” or “D” event, which occurs at [1027] time 10 ns into the cycle. Timing Edge T2 is also used to generate a “Force Down” or “D” event at time 30 ns. Finally Timing Edge T3 is used to generate a “Force Off” or “Z” event at time 45 ns.
  • The second waveform character “1” uses Timing Edge T1 to program the “Force Up” or “U” event, which occurs at [1028] time 10 ns into the cycle. Timing Edge T2 is also used to generate a “Force Down” or “D” event at time 30 ns. Finally Timing Edge T3 is used to generate a “Force Off” or “Z” event at time 45 ns.
  • In this fashion, the WFCs are mapped into the WFM memory and WTM memory of the Frame Processor. The final setup of Waveform Memory WFM of LTS1 for pin “SIG” is illustrated in Table 2 below. [1029]
    TABLE 2
    Index (WFC) T1Set T1ReSet T2Set T2ReSet T2Drel T2Dret EXPH EXPHZ
    0 0 1 1
    1 1 1 1
    2 d 1 1
    3 u 1 1
    4 L
    5 H 1
    6 m
    7 n 1
    Index T3Set T3ReSet T3Drel T3Dret T4Drel T4Dret EXPL EXPHZ
    0 1
    1 1
    2 1
    3 1
    4 1
    5
    6 1
    7
  • The final setup of Waveform Timing Memory WTM of LTS1 for pin “SIG” is illustrated in Table 3 below. [1030]
    TABLE 3
    Index (WFC) T1 T2 EXPH T3 T4 EXPL
    0 0 10ns 30ns 45ns
    1 1 10ns 30ns 45ns
    2 d 12ns 32ns 42ns
    3 u 12ns 32ns 42ns
    4 L 17ns
    5 H 17ns
    6 m 15ns
    7 n 15ns
  • The “CLK” pin uses up a single waveform and thus the WFM and WFT for this pin are very simple. The final setup of Waveform Memory WFM of LTS1 for the “CLK” pin is illustrated in Table 4 below. [1031]
    TABLE 4
    Index (WFC) T1Set T1ReSet T2Set T2ReSet T2Drel T2Dret EXPH EXPHZ
    0 1 1 1
    1
    2
    3
    4
    5
    6
    7
    Index T3Set T3ReSet T3Drel T3Dret T4Drel T4Dret EXPL EXPHZ
    0
    1
    2
    3
    4
    5
    6
    7
  • The final setup of Waveform Timing Memory WTM of LTS2 is illustrated in Table 5 below. [1032]
    TABLE 5
    Index (WFC) T1 T2 EXPH T3 T4 EXPL
    0 1 20ns 40ns
    1
    2
    3
    4
    5
    6
    7
  • The TimingMap block explicitly maps out the WaveformSelectors to the Waveform tables of the Timing block. For a tester system this boils down to setting up the Timing Set Scrambler (TSS) memory. The TSS basically contains a mapping from the GTS to the LTS that holds the settings. The TSS setup for our example for pin SIG will look like Table 6 below. [1033]
    TABLE 6
    GTS LTS
    0 (wfs1) 1
    1 (wfs2) 1
    2 (wfs3) 2
    3 (wfs4) 1
    4 (wfs5) 3
    5 (wfs6) 1
    .
    .
    .
    N (wfs1) 1
    .
    .
    .
    255
  • Finally after the TSS and LTS setup mappings are resolved, the Pattern Compiler can use this information to program the pattern with the correct waveform table (LTS) and the correct waveform character to use. Thus our example pseudo-pattern considering only pin “SIG” is illustrated in FIG. 11. Note that this compilation has no dependency on the Timing block and only depends on the Timing-Map block. [1034]
  • G. Tester Operation [1035]
  • This section describes the basic operation of the tester operating system (TOS). The activities considered in this section are: [1036]
  • system initialization [1037]
  • Test Plan loading [1038]
  • Pattern loading [1039]
  • Running a Test Plan [1040]
  • Running an individual Test [1041]
  • System Initialization [1042]
  • In order to initialize the system in one embodiment, certain assumptions must be satisfied, and certain conditions must be met. The following sub-section lists these. [1043]
  • Preconditions [1044]
  • Copies of the relevant system software components have a central store, whose location is known to the System Controller. This may be on the System Controller itself, or on another system with a network mounted directory (or known to the SYSC via another mechanism)—whatever the mechanism, before the system can function, all software must be made available to the System Controller for use. This software includes: [1045]
  • vendor hardware control (i.e., module software) DLLs, [1046]
  • standard or user test class DLLs, and [1047]
  • user test plan DLLs. [1048]
  • The system module configuration file is available on the System Controller. Recall that this file allows the user to specify the physical configuration of the tester, e.g., the physical location and type of each module in the system chassis, as well as the names of the module software DLLs. [1049]
  • The system configuration file is available on the System Controller. Recall that this file contains the list of Site Controllers in the system, as well as a map of [1050]
  • Site Controller hostnames to Switch Matrix input port addresses. Site controllers have a service called the Site Configuration Manager (SCM) running. This service is responsible for determining what hardware is installed in each slot, by a process termed “hardware discovery”. It is also responsible for participating in the system initialization process with the System Controller. Note that the Switch Matrix operation protocol dictates, in one embodiment, that the SCM on a single Site Controller, with Switch Matrix input [1051] port connection address 1, should always be used to configure the Switch Matrix connections to the modules. Recall that this “special” site is denoted as SITEC-1.
  • The System Controller is responsible for providing each Site Controller's SCM with its Switch Matrix connection address. [1052]
  • Each Site controller's SCM is capable of starting a process called the Test Plan Server (TPS). The Test Plan Server on each Site Controller is ultimately responsible for containing and executing the user's test plan (or test plans, in the case where a single Site Controller is running tests on multiple DUTs). [1053]
  • Initialization Phase I: System Validation [1054]
  • Once the above assumptions and preconditions have been satisfied, system initialization first proceeds with a system validation step as follows: [1055]
  • 1. The System Controller reads the system and module configuration files to initialize the user-specified view of the system. [1056]
  • 2. Using the specified system configuration information, the System Controller verifies that the specified Site Controllers are alive, reachable, and ready (i.e., have SCMs running). Any error during this verification step will cause a system error to be raised, and initialization to be aborted. [1057]
  • 3. The System Controller then instructs the SCM service at SITEC-1 to configure the switch matrix to have access to all hardware modules, and requests it to perform hardware discovery. [1058]
  • 4. The SCM service at SITEC-1 polls all available module slots (known hardware locations) for {vendor, hardware} tuples and generates a map of {vendor, hardware} tuples to slots. At conclusion, this poll has thus identified the entire set of (vendor, hardware, slot) bindings that exist in the complete system. The results of this poll are sent to the System Controller. [1059]
  • 5. The System Controller verifies that the results of the above hardware discovery step match the user-specified configuration in the module configuration file. Any error during this verification step will cause a system error to be raised, and initialization to be aborted. [1060]
  • 6. The System Controller then loads a default environment (such as search paths for module DLLs, pattern lists, patterns, test plan DLLs, test class DLLs, etc.) from the environment setup file(s) at well-known location(s). [1061]
  • 7. The System Controller ensures that all identified module software DLLs exist. If one is not available on the System Controller, it is retrieved from the central store, if possible; otherwise, a system error is raised, and initialization is aborted. [1062]
  • Initialization Phase II: Site Configuration (Optional) [1063]
  • Site configuration, or site partitioning, involves the software-level assignment of the available system hardware modules to different sites (i.e., to service multiple DUTs). Recall that site-partitioning information is provided in a socket file. [1064]
  • The tester system allows site (re-)partitioning to be performed both as part of a test plan load (since each test plan is associated with a particular socket), and as an independent user-callable step. In the latter case, the user initiates the site partitioning by providing a socket file that is used solely to partition the system. This is especially useful during system initialization in the case of multi-DUT testing where each site tests a different DUT type. However, this step is optional during the initialization stage, and the user can choose not to have it performed, opting instead to allow a test plan load to partition the system appropriately. [1065]
  • Whatever the means chosen to effect site partitioning (by an independent call or implicitly through a test plan load), the mechanism is the same. This mechanism is described below. [1066]
  • 1. Given the socket, the System Controller first determines whether the currently existing system partition is compatible with the socket, or whether a re-partitioning is necessary. The default partition during initialization is one in which all available modules are connected to SITEC-1. The remaining steps below are performed only if re-partitioning is needed. [1067]
  • 2. The System Controller sends a configuration message to each Site Controller SCM to re-configure itself with the number and identities of DUT sites that are enabled for it under the new socket. Note that this is a general procedure, and handles the case where the number of DUT sites controlled by a Site Controller is one. The new socket information is also conveyed to the SCMs. [1068]
  • 3. Each SCM stops the running TPS, if any, and starts a new one, initializing it with the new socket, and the number and identities of DUT sites that are enabled for it under the new socket. [1069]
  • 4. The System Controller determines which sites need what subsets of the required system modules. While doing this, it also prepares hardware slot information for the sites. The net result is, for each site, a list of slots versus module DLLs assigned to that site. This site-specific list will be denoted as the Site Module DLL Slot List (SITE-MDSL). [1070]
  • 5. The System Controller provides the appropriate SITE-MDSL, as well as the necessary module DLLs, to each SCM. Each SCM in turn makes this information available to the newly-started TPS. [1071]
  • 6. The System Controller then requests SITEC-1 to configure the Switch Matrix for the proper site-to-slot connections, that is, for site-partitioned operation. [1072]
  • 7. The TPSs on [1073] sites 1 through n load the DLLs specified in their SITE-MDSL. Each of these DLLs has a function named initialize( ) which takes an array of slot numbers. The TPS calls initialize( ) with the appropriate slot lists for that module type. On any malfunctions at this point, a system error is raised, and initialization is aborted. The initialize( ) method does the following:
  • a. Creates concrete classes based on a standard interface IXxXModule. For example, a DLL associated with a digital module will create a single IPinModule-based object to service each slot it is associated with. [1074]
  • b. Creates concrete classes based on interface IResource, one for each “resource unit” in the module. Again, for a digital module, each IPinModule-based object will create ITesterPin-based objects for all pins in the collection of slots occupied by digital modules. [1075]
  • 8. The TPSs on [1076] sites 1 through n then call getXXXModule( ) on each loaded module DLL to retrieve module contents information.
  • 9. Each call to getXXXModule( ) returns a <VendorHWType>Module class object as an IModule pointer (e.g., AdvantestPinModule). Each such IModule pointer is cached by the TPS, which makes these available to framework/user code. Note that the collection of IModules, IResources, etc. are persistent (at least for the lifetime of the TPS). [1077]
  • 10. Once the above steps are complete, the TPS starts to listen( ) on its assigned (well-known) port. This signals to the System Controller that the TPS is “ready” to begin normal (i.e., site-partitioned) operation. [1078]
  • Test Plan Load [1079]
  • This section describes the steps by which a user Test Plan DLL is loaded on a Site Controller (for single or multiple DUT testing). [1080]
  • Once system initialization (and optionally, initial site partitioning) has been completed, user test plans can be loaded. The loading of a user test plan on a Site Controller proceeds as follows: [1081]
  • 1. The System Controller first loads the test plan DLL into its own process space, querying it for its associated socket file and its DUT type identifier. This information is used to identify the site(s) running this test plan, and hence, the Site Controller(s) that this test plan would be loaded on. [1082]
  • 2. The System Controller then uses the socket information associated with the test plan to initiate the re-partitioning process as outlined above. [1083]
  • 3. The System Controller extracts the list of test class DLLs used by the test plan from the test plan DLL, and once the System Controller has verified that the TPS is ready to begin normal (i.e., site-partitioned) operation, sends the test class DLLs, and, finally, the test Plan DLL itself, to the appropriate TPS. [1084]
  • 4. The TPS calls LoadLibrary( ) to load it into its process space. It calls a well-known function on the DLL to create as many TestPlan objects as the number of sites (i.e., DUTs) it is servicing. [1085]
  • 5. The TPS initializes the TestPlan object(s) with the necessary tester framework objects. During initialization, the TPS loads the appropriate DLLs for the test classes used by the TestPlan object(s) into the process space, and creates the test class instances. [1086]
  • 6. The TPS sets up the communications channel to/from the System Controller to the TestPlan object(s). [1087]
  • 7. The System Controller communicates with the TPS, and builds its proxies for the TestPlan object(s). [1088]
  • The concludes the successful load of the user's Test Plan on a Site Controller. [1089]
  • Running a Test Plan [1090]
  • The method to execute all tests in a test plan according to the pre-defined flow logic is as follows: [1091]
  • 1. The user's application transmits a RunTestPlan message to the TPS. The TPS sends an ExecutingTestPlan message to all connected applications. The TPS then calls execute( ) on the Test Plan. [1092]
  • 2. Testing multiple DUTs with a single Site Controller is performed using multiple threads on that Site Controller, one per DUT. Each thread runs a different, independent instance of the same TestPlan object. Since, in this case, module control software DLLs might be shared across DUTs, the module commands for hardware communication are required to take a DUT identifier parameter. [1093]
  • 3. The TestPlan object iterates over each test in its collection (alternatively, tells its Flow object to process each test according to the flow logic), calling preExec( ), execute( ), and postExec( ). [1094]
  • 4. As each test executes, status messages are sent back to all connected applications. [1095]
  • Executing a Single Test [1096]
  • A user may wish to execute a single test in a test plan instead of all tests. For single test execution, the method is as follows. [1097]
  • 1. User application transmits a RunTest message to the TPS; the TPS sends an ExecutingTest message to all connected applications. The TPS then calls executeTest( ) on the Test Plan, specifying the test to run. [1098]
  • 2. The Test Plan object executes the specified test by calling preExec( ), execute( ), and postExec( ) on that test object. [1099]
  • 3. When the test executes, it sends status messages back to all connected applications. [1100]
  • Although the invention has been described in conjunction with particular embodiments, it will be appreciated that various modifications and alterations may be made by those skilled in the art without departing from the spirit and scope of the invention. The invention is not to be limited by the foregoing illustrative details, but rather interpreted according to the scope of the claims. [1101]

Claims (23)

What is claimed is:
1. A method for developing a test program in general purpose C/C++ constructs, the test program for testing a semiconductor integrated circuit (IC) in a semiconductor test system, the method comprising:
describing test system resources, test system configuration, and module configuration in general-purpose C/C++ constructs for the development of a test program to test the IC on the semiconductor test system;
describing a test sequence in general-purpose C/C++ constructs for the development of the test program to test the IC on the semiconductor test system;
describing a test plan in general-purpose C/C++ constructs for the development of the test program to test the IC on the semiconductor test system;
describing test conditions in general-purpose C/C++ constructs for the development of the test program to test the IC on the semiconductor test system;
describing test patterns in general-purpose C/C++ constructs for the development of the test program to test the IC on the semiconductor test system; and
describing timing of the test patterns in general-purpose C/C++ constructs for the development of the test program to test the IC on the semiconductor test system.
2. The method of claim 1, wherein describing test system resources comprises:
specifying a resource type, wherein the resource type is associated with at least one test module for applying a test to the IC;
specifying a parameter type associated with the resource type, and
specifying a parameter of the parameter type.
3. The method of claim 1, wherein describing test system configuration comprises:
specifying a site controller for controlling at least one test module, each test module for applying a test to the IC; and
specifying an input port of a module connection enabler,
wherein the test system couples the site controller to the module connection enabler at the input port, and the module connection enabler couples the site controller to the at least one test module.
4. The method of claim 3, wherein the module connection enabler is a switch matrix.
5. The method of claim 1, wherein describing module configuration comprises:
specifying a module identifier for specifying a module type;
specifying executable code for controlling a test module of the module type specified by the module identifer, the test module for applying a test to the IC; and
specifying a resource type associated with the test module.
6. The method of claim 5, the method further comprising specifying a slot identifier for specifying an output port of a module connection enabler, wherein the test system couples the test module to the module connection enabler at the output port, and the module connection enabler couples the test module to a corresponding site controller.
7. The method of claim 6, wherein the module connection enabler is a switch matrix.
8. The method of claim 5, wherein the executable code is a dynamic link library.
9. The method of claim 5, further comprising specifying a vendor identifier for identifying the provider of the test module.
10. The method of claim 5, further comprising specifying an identifier of the maximum number of resource units available in connection with the resource type.
11. The method of claim 5, wherein the resource type is digital tester pins and the resource units are tester channels.
12. The method of claim 5, wherein the resource type is analog tester pins and the resource units are tester channels.
13. The method of claim 5, wherein the resource type is RF tester pins and the resource units are tester channels.
14. The method of claim 5, wherein the resource type is power supply pins and the resource units are tester channels.
15. The method of claim 5, wherein the resource type is digitizer pins and the resource units are tester channels.
16. The method of claim 5, wherein the resource type is arbitrary waveform generation pins and the resource units are tester channels.
17. The method of claim 5, wherein the resource type is associated with resource units, the method further comprising specifying an indicator relating to which resource units are disabled.
18. The method of claim 18, wherein resource units indicated as disabled represent defective resource units of the test module.
19. The method of claim 1, wherein describing test conditions comprises:
specifying at least one test condition group.
20. The method of claim 19, wherein describing test conditions further comprises:
specifying at least one specification set including at least one variable; and
specifying a selector for selecting an expression to be bound to a variable.
21. The method of claim 20, wherein association of the test condition group with a selector for the at least one specification set defines a test condition.
22. The method of claim 21, wherein the test condition is an object.
23. The method of claim 1, wherein describing a test sequence comprises specifying:
a result of executing a flow or test;
an action based upon the result; and
a transition to another flow or test based upon the result.
US10/772,434 2003-02-14 2004-02-06 Method and structure to develop a test program for semiconductor integrated circuits Abandoned US20040225459A1 (en)

Priority Applications (6)

Application Number Priority Date Filing Date Title
US10/772,434 US20040225459A1 (en) 2003-02-14 2004-02-06 Method and structure to develop a test program for semiconductor integrated circuits
TW093103547A TWI344595B (en) 2003-02-14 2004-02-13 Method and structure to develop a test program for semiconductor integrated circuits
US10/917,916 US7184917B2 (en) 2003-02-14 2004-08-13 Method and system for controlling interchangeable components in a modular test system
US10/918,714 US7197417B2 (en) 2003-02-14 2004-08-13 Method and structure to develop a test program for semiconductor integrated circuits
US10/918,513 US7209851B2 (en) 2003-02-14 2004-08-13 Method and structure to develop a test program for semiconductor integrated circuits
US12/748,317 US8255198B2 (en) 2003-02-14 2010-03-26 Method and structure to develop a test program for semiconductor integrated circuits

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US44783903P 2003-02-14 2003-02-14
US44962203P 2003-02-24 2003-02-24
US10/772,434 US20040225459A1 (en) 2003-02-14 2004-02-06 Method and structure to develop a test program for semiconductor integrated circuits

Related Child Applications (4)

Application Number Title Priority Date Filing Date
US10/918,513 Continuation-In-Part US7209851B2 (en) 2003-02-14 2004-08-13 Method and structure to develop a test program for semiconductor integrated circuits
US10/918,714 Continuation-In-Part US7197417B2 (en) 2003-02-14 2004-08-13 Method and structure to develop a test program for semiconductor integrated circuits
US10/917,916 Continuation-In-Part US7184917B2 (en) 2003-02-14 2004-08-13 Method and system for controlling interchangeable components in a modular test system
US12/748,317 Division US8255198B2 (en) 2003-02-14 2010-03-26 Method and structure to develop a test program for semiconductor integrated circuits

Publications (1)

Publication Number Publication Date
US20040225459A1 true US20040225459A1 (en) 2004-11-11

Family

ID=39265262

Family Applications (6)

Application Number Title Priority Date Filing Date
US10/772,434 Abandoned US20040225459A1 (en) 2003-02-14 2004-02-06 Method and structure to develop a test program for semiconductor integrated circuits
US10/772,327 Active 2026-02-11 US7437261B2 (en) 2003-02-14 2004-02-06 Method and apparatus for testing integrated circuits
US10/814,603 Abandoned US20050039079A1 (en) 2003-02-14 2004-03-31 Test emulator, test module emulator, and record medium storing program therein
US11/860,437 Abandoned US20080016396A1 (en) 2003-02-14 2007-09-24 Test emulator, test module emulator and record medium storing program therein
US11/860,469 Abandoned US20080010524A1 (en) 2003-02-14 2007-09-24 Test emulator, test module emulator and record medium storing program therein
US12/748,317 Expired - Lifetime US8255198B2 (en) 2003-02-14 2010-03-26 Method and structure to develop a test program for semiconductor integrated circuits

Family Applications After (5)

Application Number Title Priority Date Filing Date
US10/772,327 Active 2026-02-11 US7437261B2 (en) 2003-02-14 2004-02-06 Method and apparatus for testing integrated circuits
US10/814,603 Abandoned US20050039079A1 (en) 2003-02-14 2004-03-31 Test emulator, test module emulator, and record medium storing program therein
US11/860,437 Abandoned US20080016396A1 (en) 2003-02-14 2007-09-24 Test emulator, test module emulator and record medium storing program therein
US11/860,469 Abandoned US20080010524A1 (en) 2003-02-14 2007-09-24 Test emulator, test module emulator and record medium storing program therein
US12/748,317 Expired - Lifetime US8255198B2 (en) 2003-02-14 2010-03-26 Method and structure to develop a test program for semiconductor integrated circuits

Country Status (3)

Country Link
US (6) US20040225459A1 (en)
AT (1) ATE390637T1 (en)
DE (1) DE602004012714T2 (en)

Cited By (43)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050262412A1 (en) * 2004-05-22 2005-11-24 Advantest America R&D Center, Inc. Method and system for simulating a modular test system
US20050261855A1 (en) * 2004-05-22 2005-11-24 Advantest America R&D Center, Inc. Supporting calibration and diagnostics in an open architecture test system
US20050262414A1 (en) * 2004-05-22 2005-11-24 Advantest America R&D Center, Inc. Datalog support in a modular test system
US20060047658A1 (en) * 2004-08-31 2006-03-02 Microsoft Corporation Verifying dynamically generated operations on a data store
US20060062155A1 (en) * 2004-09-21 2006-03-23 Peter Hanping Chen Method for ip characterization and path finding, and computer readable recording medium for storing program thereof
GB2418750A (en) * 2004-10-01 2006-04-05 Nec Technologies DLL component having export function through an interface
US20060090100A1 (en) * 2004-08-27 2006-04-27 Gerald Holzapfel Functional unit for carrying out logical test cases on a test system interconnected to a unit to be tested and corresponding method
US20060130041A1 (en) * 2004-12-09 2006-06-15 Advantest Corporation Method and system for performing installation and configuration management of tester instrument modules
WO2006081869A1 (en) * 2004-12-23 2006-08-10 Airbus Deutschland Gmbh Device and method for testing components and systems
US20060195747A1 (en) * 2005-02-17 2006-08-31 Ankan Pramanick Method and system for scheduling tests in a parallel test system
US20060200816A1 (en) * 2005-03-02 2006-09-07 Advantest America R&D Center, Inc. Compact representation of vendor hardware module revisions in an open architecture test system
US20070022349A1 (en) * 2005-07-07 2007-01-25 Agilent Technologies, Inc. Test apparatus with tester channel availability identification
US7184917B2 (en) 2003-02-14 2007-02-27 Advantest America R&D Center, Inc. Method and system for controlling interchangeable components in a modular test system
US7197417B2 (en) 2003-02-14 2007-03-27 Advantest America R&D Center, Inc. Method and structure to develop a test program for semiconductor integrated circuits
US20070233629A1 (en) * 2006-04-04 2007-10-04 Gil Balog Methods and systems for semiconductor testing using a testing scenario language
US20070266288A1 (en) * 2006-05-15 2007-11-15 Erik Volkerink Re-configurable architecture for automated test equipment
US20080007284A1 (en) * 2006-07-05 2008-01-10 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US20080291987A1 (en) * 2005-06-14 2008-11-27 Akihisa Kumaki Test Signal Generating Apparatus for Communications Equipment and Test Signal Generating Method for Communications Equipment
US20090043526A1 (en) * 2007-08-09 2009-02-12 Yong Zhang Integrated high-efficiency microwave sourcing control process
US20090055803A1 (en) * 2005-05-20 2009-02-26 Advantest Corporation Semiconductor test program debug device
US20090089688A1 (en) * 2007-09-27 2009-04-02 International Business Machines Corporation Generating test scenarios using reusable triggers indicating graphical user interface (gui) elements and actions
US20090119542A1 (en) * 2007-11-05 2009-05-07 Advantest Corporation System, method, and program product for simulating test equipment
US20090276201A1 (en) * 2008-05-05 2009-11-05 Airbus Deutschland Gmbh Method For Configuring A Test Arrangement, Test Method And Test Arrangement
US20100192135A1 (en) * 2003-02-14 2010-07-29 Advantest Corporation Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits
US20110112790A1 (en) * 2008-07-07 2011-05-12 Eitan Lavie System and method for automatic hardware and software sequencing of computer-aided design (cad) functionality testing
US20120173575A1 (en) * 2008-07-31 2012-07-05 Dustin Kurt Adler Record Based Code Structure
US20120323973A1 (en) * 2011-06-16 2012-12-20 Hon Hai Precision Industry Co., Ltd. System and method for converting component data
US20130042143A1 (en) * 2011-08-11 2013-02-14 Intel Mobile Communications Technology Dresden GmbH Circuit Arrangement and Method for Testing Same
US20130102091A1 (en) * 2011-10-25 2013-04-25 Teradyne, Inc. Test system supporting simplified configuration for controlling test block concurrency
US20130193993A1 (en) * 2010-01-20 2013-08-01 Gil Golov Method and apparatus for testing a device-under-test
US20130231886A1 (en) * 2012-03-01 2013-09-05 Advantest Corporation Test apparatus and test module
US20150149106A1 (en) * 2011-08-31 2015-05-28 Teseda Corporation Field triage of eos failures in semiconductor devices
US20150372866A1 (en) * 2014-06-20 2015-12-24 Tellabs Operations, Inc. Method and Apparatus for Providing Automatic Node Configuration Using A Dongle
US20160070631A1 (en) * 2013-04-09 2016-03-10 Eads Deutschland Gmbh Multiuser-Capable Test Environment for a Plurality of Test Objects
US20160169954A1 (en) * 2014-12-12 2016-06-16 Airbus Defence and Space S.A. Method and system for performing electrical tests on complex devices
US10191736B2 (en) * 2017-04-28 2019-01-29 Servicenow, Inc. Systems and methods for tracking configuration file changes
US20190227915A1 (en) * 2019-03-29 2019-07-25 Intel Corporation Programmatically generating software test libraries for functional safety
US20190277907A1 (en) * 2018-03-06 2019-09-12 Advantest Corporation Scalable platform for system level testing
CN111611007A (en) * 2020-05-21 2020-09-01 掌阅科技股份有限公司 Script-based application program installation package packaging method and device
US10811118B2 (en) 2018-06-12 2020-10-20 Samsung Electronics Co., Ltd. Test interface boards, test systems, and methods of operating test interface boards
CN113051114A (en) * 2021-03-19 2021-06-29 无锡市软测认证有限公司 Method for improving chip testing efficiency
US11156659B2 (en) * 2018-11-13 2021-10-26 Advantest Corporation Optimization and scheduling of the handling of devices in the automation process
US11159303B1 (en) 2018-11-20 2021-10-26 Mitsubishi Electric Corporation Communication system, list distribution station, communication method, and computer readable medium

Families Citing this family (102)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7051304B2 (en) * 2003-05-01 2006-05-23 Sun Microsystems, Inc. Distributed infiniband verification protocol
US6898534B2 (en) * 2003-05-05 2005-05-24 Texas Instruments Incorporated DC measurement method and system using sigma-delta modulation pattern
US20050097565A1 (en) * 2003-10-31 2005-05-05 Udo Klein Gathering message information
TW200535604A (en) * 2004-04-16 2005-11-01 Hon Hai Prec Ind Co Ltd Test data collection and management system and method
US20060020553A1 (en) * 2004-07-26 2006-01-26 Septon Daven W License proxy process to facilitate license sharing between a plurality of applications
US20060036907A1 (en) * 2004-08-11 2006-02-16 Emc Corporation Area-and product-independent test automation system and method for automatically synchronizing tests of multiple devices
US20060126799A1 (en) * 2004-12-15 2006-06-15 Microsoft Corporation Fault injection
US7539977B1 (en) * 2005-01-21 2009-05-26 Xilinx, Inc. Automatic bug isolation in computer programming languages
JP4820560B2 (en) * 2005-03-07 2011-11-24 株式会社アドバンテスト Test apparatus, test method, electronic device production method, test simulator, and test simulation method
JP2006275986A (en) * 2005-03-30 2006-10-12 Advantest Corp Diagnosis program, switch program, test device, and diagnosis method
US7254508B2 (en) * 2005-04-29 2007-08-07 Teradyne, Inc. Site loops
US7487422B2 (en) * 2005-04-29 2009-02-03 Teradyne, Inc. Delayed processing of site-aware objects
US7253607B2 (en) * 2005-04-29 2007-08-07 Teradyne, Inc. Site-aware objects
US20070038851A1 (en) * 2005-08-12 2007-02-15 Babaria Amit G Method for programming secure data into integrated circuits
JP4935044B2 (en) * 2005-10-11 2012-05-23 セイコーエプソン株式会社 Ultraviolet curable ink set and image recording method
US7673199B2 (en) * 2006-02-03 2010-03-02 Teradyne, Inc. Multi-stream interface for parallel test processing
JP4153957B2 (en) * 2006-02-27 2008-09-24 株式会社アドバンテスト Test system, additional apparatus, and test method
WO2007098805A1 (en) * 2006-02-28 2007-09-07 Mentor Graphics Corp. Monitoring physical parameters in an emulation environment
US7853828B2 (en) * 2006-05-11 2010-12-14 Verigy (Singapore) Pte. Ltd. Graphically extensible, hardware independent method to inspect and modify state of test equipment
US8332818B1 (en) * 2006-06-26 2012-12-11 Versata Development Group, Inc. Flash testing framework
US7869986B2 (en) * 2006-07-10 2011-01-11 Blancha Barry E System and method for performing processing in a testing system
WO2008020840A2 (en) * 2006-08-15 2008-02-21 Texas Instruments Incorporated Method for programming secure data into integrated circuits
US8131644B2 (en) 2006-08-29 2012-03-06 Sap Ag Formular update
US8065661B2 (en) * 2006-08-29 2011-11-22 Sap Ag Test engine
US7590954B2 (en) * 2006-10-31 2009-09-15 Litepoint Corp. Test solution development method
US7640132B2 (en) * 2007-04-23 2009-12-29 Advantest Corporation Recording medium and test apparatus
US8078898B2 (en) 2007-06-07 2011-12-13 Texas Instruments Incorporated Synchronizing TAP controllers with sequence on TMS lead
WO2009011033A1 (en) * 2007-07-17 2009-01-22 Advantest Corporation Testing apparatus, circuit apparatus and program
US8310270B2 (en) * 2007-10-04 2012-11-13 Teradyne, Inc. Emulating behavior of a legacy test system
US20090119084A1 (en) * 2007-11-05 2009-05-07 Advantest Corporation System, method, and program product for simulating test equipment
US7809520B2 (en) * 2007-11-05 2010-10-05 Advantest Corporation Test equipment, method for loading test plan and program product
US8402438B1 (en) 2007-12-03 2013-03-19 Cadence Design Systems, Inc. Method and system for generating verification information and tests for software
US8156474B2 (en) * 2007-12-28 2012-04-10 Cadence Design Systems, Inc. Automation of software verification
US7983893B2 (en) 2008-01-08 2011-07-19 Mentor Graphics Corporation Fault support in an emulation environment
US8214195B2 (en) * 2008-03-21 2012-07-03 Mentor Graphics Corporation Testing in a hardware emulation environment
US20090248390A1 (en) * 2008-03-31 2009-10-01 Eric Durand Trace debugging in a hardware emulation environment
KR101452959B1 (en) * 2008-06-02 2014-10-24 삼성전자주식회사 Mount-type test equipment and method thereof
US8005639B2 (en) * 2008-09-04 2011-08-23 Flextronics Ap, Llc Compact framework for automated testing
US8504344B2 (en) * 2008-09-30 2013-08-06 Cadence Design Systems, Inc. Interface between a verification environment and a hardware acceleration engine
US8135659B2 (en) 2008-10-01 2012-03-13 Sap Ag System configuration comparison to identify process variation
US8396893B2 (en) * 2008-12-11 2013-03-12 Sap Ag Unified configuration of multiple applications
US8255429B2 (en) 2008-12-17 2012-08-28 Sap Ag Configuration change without disruption of incomplete processes
US8112249B2 (en) * 2008-12-22 2012-02-07 Optimaltest Ltd. System and methods for parametric test time reduction
US8495583B2 (en) 2009-09-11 2013-07-23 International Business Machines Corporation System and method to determine defect risks in software solutions
US8893086B2 (en) 2009-09-11 2014-11-18 International Business Machines Corporation System and method for resource modeling and simulation in test planning
US8578341B2 (en) 2009-09-11 2013-11-05 International Business Machines Corporation System and method to map defect reduction data to organizational maturity profiles for defect projection modeling
US8539438B2 (en) 2009-09-11 2013-09-17 International Business Machines Corporation System and method for efficient creation and reconciliation of macro and micro level test plans
US8527955B2 (en) 2009-09-11 2013-09-03 International Business Machines Corporation System and method to classify automated code inspection services defect output for defect analysis
US10235269B2 (en) * 2009-09-11 2019-03-19 International Business Machines Corporation System and method to produce business case metrics based on defect analysis starter (DAS) results
US8094566B2 (en) * 2009-12-24 2012-01-10 Advantest Corporation Test apparatus and test method
US8621426B2 (en) * 2010-02-22 2013-12-31 Intel Corporation Automated top down process to minimize test configurations for multi-feature products
US8539446B2 (en) * 2010-02-22 2013-09-17 Satwant Kaur Reduced interoperability validation sets for multi-feature products
JP2012064284A (en) * 2010-09-17 2012-03-29 Toshiba Corp Memory tester
US8776014B2 (en) * 2010-09-23 2014-07-08 Microsoft Corporation Software build analysis
TWI450118B (en) * 2010-11-02 2014-08-21 Global Unichip Corp Hybrid electronic design system and reconfigurable connection matrix thereof
US8839057B2 (en) * 2011-02-03 2014-09-16 Arm Limited Integrated circuit and method for testing memory on the integrated circuit
US9104795B2 (en) * 2011-06-28 2015-08-11 International Business Machines Corporation Integrating compiler warnings into a debug session
US8661293B2 (en) * 2011-06-30 2014-02-25 International Business Machines Corporation Test architecture based on intelligent test sequence
US20130007517A1 (en) * 2011-06-30 2013-01-03 International Business Machines Corporation Checkpoint Recovery Utility for Programs and Compilers
US8793535B2 (en) * 2011-07-21 2014-07-29 Microsoft Corporation Optimizing system usage when running quality tests in a virtual machine environment
US9098633B2 (en) * 2011-09-07 2015-08-04 Hewlett-Packard Indigo B.V. Application testing
TWI447410B (en) * 2011-12-19 2014-08-01 Azurewave Technologies Inc System of testing multiple rf modules and method thereof
US9489184B2 (en) * 2011-12-30 2016-11-08 Oracle International Corporation Adaptive selection of programming language versions for compilation of software programs
JP2013250250A (en) 2012-06-04 2013-12-12 Advantest Corp Tester hardware and test system using the same
US9582625B2 (en) 2012-06-22 2017-02-28 Mentor Graphics Corporation Test bench transaction synchronization in a debugging environment
US8782581B2 (en) * 2012-07-12 2014-07-15 Mentor Graphics Corporation Test bench hierarchy and connectivity in a debugging environment
US8893065B2 (en) 2012-07-11 2014-11-18 Mentor Graphics Corporation Biometric markers in a debugging environment
US9217772B2 (en) * 2012-07-31 2015-12-22 Infineon Technologies Ag Systems and methods for characterizing devices
US8918763B2 (en) * 2013-01-30 2014-12-23 Hewlett-Packard Development Company, L.P. Marked test script creation
US11009550B2 (en) 2013-02-21 2021-05-18 Advantest Corporation Test architecture with an FPGA based test board to simulate a DUT or end-point
US10162007B2 (en) 2013-02-21 2018-12-25 Advantest Corporation Test architecture having multiple FPGA based hardware accelerator blocks for testing multiple DUTs independently
US9952276B2 (en) * 2013-02-21 2018-04-24 Advantest Corporation Tester with mixed protocol engine in a FPGA block
US10161993B2 (en) 2013-02-21 2018-12-25 Advantest Corporation Tester with acceleration on memory and acceleration for automatic pattern generation within a FPGA block
US9274911B2 (en) 2013-02-21 2016-03-01 Advantest Corporation Using shared pins in a concurrent test execution environment
US9810729B2 (en) 2013-02-28 2017-11-07 Advantest Corporation Tester with acceleration for packet building within a FPGA block
US9785542B2 (en) * 2013-04-16 2017-10-10 Advantest Corporation Implementing edit and update functionality within a development environment used to compile test plans for automated semiconductor device testing
US9785526B2 (en) 2013-04-30 2017-10-10 Advantest Corporation Automated generation of a test class pre-header from an interactive graphical user interface
US20140358514A1 (en) * 2013-05-31 2014-12-04 Nvidia Corporation System and method for automatically generating offline result emulation files from a testflow
JP2014235127A (en) * 2013-06-04 2014-12-15 株式会社アドバンテスト Test system, control program, and configuration data write method
US9310427B2 (en) 2013-07-24 2016-04-12 Advantest Corporation High speed tester communication interface between test slice and trays
US9170290B1 (en) 2013-08-23 2015-10-27 Audyssey Laboratories, Inc. Method for asynchronous impulse response measurement between separately clocked systems
US9329875B2 (en) * 2014-04-28 2016-05-03 International Business Machines Corporation Global entry point and local entry point for callee function
TWI569028B (en) * 2014-05-02 2017-02-01 塞拉有限公司 Debugging system
US9424081B2 (en) 2014-12-15 2016-08-23 Microsoft Technology Licensing, Llc Managing callback operations in emulated environments
US9494651B2 (en) * 2015-01-08 2016-11-15 Honeywell Limited Method for testing embedded systems
US9627000B1 (en) * 2015-12-14 2017-04-18 Facebook, Inc. Canary testing for storage devices
US10783311B2 (en) 2016-10-31 2020-09-22 Synopsys, Inc. DRC processing tool for early stage IC layout designs
US10598722B1 (en) 2016-12-23 2020-03-24 Advanced Testing Technologies, Inc. Automated waveform analysis methods using a parallel automated development system
US9739827B1 (en) * 2016-12-23 2017-08-22 Advanced Testing Technologies, Inc. Automated waveform analysis using a parallel automated development system
CN107025171A (en) * 2017-03-10 2017-08-08 深圳航天科技创新研究院 A kind of method for realizing virtual checking system failure injection
US10564219B2 (en) * 2017-07-27 2020-02-18 Teradyne, Inc. Time-aligning communication channels
US10628276B2 (en) 2018-06-29 2020-04-21 International Business Machines Corporation Unit test framework for testing code in a gateway service
WO2020063483A1 (en) * 2018-09-28 2020-04-02 Changxin Memory Technologies, Inc. Chip test method, apparatus, device, and system
CN109446718B (en) * 2018-11-15 2023-06-20 清能华控科技有限公司 Visual development method and system for protection device and control device
US10976361B2 (en) 2018-12-20 2021-04-13 Advantest Corporation Automated test equipment (ATE) support framework for solid state device (SSD) odd sector sizes and protection modes
DE112020000434T5 (en) * 2019-01-10 2021-10-21 Tektronix, Inc. DISAGGREGATED DISTRIBUTED MEASUREMENT ANALYSIS SYSTEM USING DYNAMIC APPLICATION BUILDER
US11137910B2 (en) 2019-03-04 2021-10-05 Advantest Corporation Fast address to sector number/offset translation to support odd sector size testing
US11237202B2 (en) 2019-03-12 2022-02-01 Advantest Corporation Non-standard sector size system support for SSD testing
US10884847B1 (en) 2019-08-20 2021-01-05 Advantest Corporation Fast parallel CRC determination to support SSD testing
TWI773140B (en) * 2020-03-05 2022-08-01 日商愛德萬測試股份有限公司 Graphical user interface for traffic capture and debugging tool
US11650893B2 (en) * 2020-03-31 2023-05-16 Advantest Corporation Multiple name space test systems and methods
CN112134861B (en) * 2020-09-11 2023-04-07 杭州安恒信息安全技术有限公司 Attack and defense drilling equipment

Citations (35)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4807161A (en) * 1983-11-25 1989-02-21 Mars Incorporated Automatic test equipment
US5025205A (en) * 1989-06-22 1991-06-18 Texas Instruments Incorporated Reconfigurable architecture for logic test system
US5181201A (en) * 1990-02-07 1993-01-19 General Dynamics Land Systems Inc. Interface chip device
US5262716A (en) * 1992-04-21 1993-11-16 Hewlett-Packard Company Tester calibration procedure which includes fixturing
US5488573A (en) * 1993-09-02 1996-01-30 Matsushita Electric Industrial Co., Ltd. Method for generating test programs
US5668745A (en) * 1995-10-20 1997-09-16 Lsi Logic Corporation Method and apparatus for testing of semiconductor devices
US5892949A (en) * 1996-08-30 1999-04-06 Schlumberger Technologies, Inc. ATE test programming architecture
US6028439A (en) * 1997-10-31 2000-02-22 Credence Systems Corporation Modular integrated circuit tester with distributed synchronization and control
US6195774B1 (en) * 1998-08-13 2001-02-27 Xilinx, Inc. Boundary-scan method using object-oriented programming language
US20020059561A1 (en) * 2000-07-07 2002-05-16 Sun Microsystems, Inc. Software package verification
US6405364B1 (en) * 1999-08-31 2002-06-11 Accenture Llp Building techniques in a development architecture framework
US20020073371A1 (en) * 1995-04-28 2002-06-13 Whetsel Lee D. Dual mode memory for IC terminals
US20020073375A1 (en) * 1997-06-03 2002-06-13 Yoav Hollander Method and apparatus for test generation during circuit design
US6427223B1 (en) * 1999-04-30 2002-07-30 Synopsys, Inc. Method and apparatus for adaptive verification of circuit designs
US20020138244A1 (en) * 1999-09-30 2002-09-26 Meyer Steven J. Simulator independent object code HDL simulation using PLI
US20030005375A1 (en) * 2001-06-29 2003-01-02 Krech Alan S. Algorithmically programmable memory tester with test sites operating in a slave mode
US6601018B1 (en) * 1999-02-04 2003-07-29 International Business Machines Corporation Automatic test framework system and method in software component testing
US6629282B1 (en) * 1999-11-05 2003-09-30 Advantest Corp. Module based flexible semiconductor test system
US20030208747A1 (en) * 2002-05-06 2003-11-06 Sun Microsystems, Inc. Method for debugging an integrated circuit
US6651204B1 (en) * 2000-06-01 2003-11-18 Advantest Corp. Modular architecture for memory testing on event based test system
US20030217343A1 (en) * 2002-04-11 2003-11-20 Rochit Rajsuman Manufacturing method and apparatus to avoid prototype-hold in ASIC/SOC manufacturing
US6678643B1 (en) * 1999-06-28 2004-01-13 Advantest Corp. Event based semiconductor test system
US6779170B1 (en) * 2002-12-11 2004-08-17 Nvidia Corporation Method and apparatus for performing logic emulation
US20040193990A1 (en) * 2003-03-31 2004-09-30 Seiji Ichiyoshi Test apparatus and test method
US20040210798A1 (en) * 2003-03-31 2004-10-21 Shinsaku Higashi Test emulator, test module emulator, and record medium storing program therein
US20040225465A1 (en) * 2003-02-14 2004-11-11 Advantest Corporation Method and apparatus for testing integrated circuits
US20050022087A1 (en) * 2003-02-14 2005-01-27 Ankan Pramanick Method and system for controlling interchangeable components in a modular test system
US6868513B1 (en) * 2000-10-26 2005-03-15 International Business Machines Corporation Automated multi-device test process and system
US6892328B2 (en) * 2000-09-29 2005-05-10 Tanisys Technology, Inc. Method and system for distributed testing of electronic devices
US20050154551A1 (en) * 2003-02-14 2005-07-14 Advantest Corporation Method and structure to develop a test program for semiconductor integrated circuits
US6970814B1 (en) * 2000-03-30 2005-11-29 International Business Machines Corporation Remote IP simulation modeling
US7197416B2 (en) * 2004-05-22 2007-03-27 Advantest America R&D Center, Inc. Supporting calibration and diagnostics in an open architecture test system
US7210087B2 (en) * 2004-05-22 2007-04-24 Advantest America R&D Center, Inc. Method and system for simulating a modular test system
US7209851B2 (en) * 2003-02-14 2007-04-24 Advantest America R&D Center, Inc. Method and structure to develop a test program for semiconductor integrated circuits
US7430486B2 (en) * 2004-05-22 2008-09-30 Advantest America R&D Center, Inc. Datalog support in a modular test system

Family Cites Families (42)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4758920A (en) 1987-03-02 1988-07-19 Oneac Corporation Telephone and data overvoltage protection apparatus
JP2583057B2 (en) 1987-05-29 1997-02-19 株式会社 アドバンテスト IC test system
JP2587941B2 (en) 1987-05-29 1997-03-05 株式会社 アドバンテスト IC test system
JPS63315971A (en) 1987-06-19 1988-12-23 Advantest Corp Ic testing system
JPH02246841A (en) 1989-03-17 1990-10-02 Hitachi Ltd Control device and method thereof for automobile
JPH03130839A (en) 1989-10-17 1991-06-04 Chubu Nippon Denki Software Kk On-line simulation system
US5675544A (en) 1990-06-25 1997-10-07 Texas Instruments Incorporated Method and apparatus for parallel testing of memory circuits
JPH04180127A (en) 1990-11-15 1992-06-26 Oki Electric Ind Co Ltd Method for transforming class into file
JPH04204271A (en) 1990-11-30 1992-07-24 Mitsubishi Electric Corp Ic test device
JPH0561657A (en) 1991-09-04 1993-03-12 Pfu Ltd Program editing system
US5425036A (en) * 1992-09-18 1995-06-13 Quickturn Design Systems, Inc. Method and apparatus for debugging reconfigurable emulation systems
US5371883A (en) * 1993-03-26 1994-12-06 International Business Machines Corporation Method of testing programs in a distributed environment
US5748642A (en) * 1995-09-25 1998-05-05 Credence Systems Corporation Parallel processing integrated circuit tester
JP3302547B2 (en) 1995-12-05 2002-07-15 株式会社ピーエフユー Method and system for creating test vector in logic simulator
US5991907A (en) * 1996-02-02 1999-11-23 Lucent Technologies Inc. Method for testing field programmable gate arrays
US5905883A (en) * 1996-04-15 1999-05-18 Sun Microsystems, Inc. Verification system for circuit simulator
US5841967A (en) * 1996-10-17 1998-11-24 Quickturn Design Systems, Inc. Method and apparatus for design verification using emulation and simulation
US5951704A (en) * 1997-02-19 1999-09-14 Advantest Corp. Test system emulator
US6009256A (en) * 1997-05-02 1999-12-28 Axis Systems, Inc. Simulation/emulation system and method
US6026230A (en) * 1997-05-02 2000-02-15 Axis Systems, Inc. Memory simulation system and method
US6785873B1 (en) * 1997-05-02 2004-08-31 Axis Systems, Inc. Emulation system with multiple asynchronous clocks
US5828674A (en) 1997-09-16 1998-10-27 Teradyne, Inc. Production interface for integrated circuit test system
US6163805A (en) * 1997-10-07 2000-12-19 Hewlett-Packard Company Distributed automated testing system
US6202182B1 (en) * 1998-06-30 2001-03-13 Lucent Technologies Inc. Method and apparatus for testing field programmable gate arrays
US6061283A (en) 1998-10-23 2000-05-09 Advantest Corp. Semiconductor integrated circuit evaluation system
JP2000163456A (en) 1998-11-25 2000-06-16 Hitachi Ltd Logic verifying method
US6185708B1 (en) 1998-11-27 2001-02-06 Advantest Corp. Maintenance free test system
JP3942765B2 (en) * 1999-03-15 2007-07-11 株式会社アドバンテスト Semiconductor device simulation apparatus and program debugging apparatus for semiconductor test using the same
US6476628B1 (en) 1999-06-28 2002-11-05 Teradyne, Inc. Semiconductor parallel tester
US6631487B1 (en) * 1999-09-27 2003-10-07 Lattice Semiconductor Corp. On-line testing of field programmable gate array resources
JP2001184225A (en) * 1999-12-27 2001-07-06 Toshiba Microelectronics Corp Emulator and emulating method
JP2001195275A (en) 2000-01-11 2001-07-19 Advantest Corp Program execution system for semiconductor testing device
CN1154045C (en) 2000-07-25 2004-06-16 华为技术有限公司 Combined simulation system across platforms
JP3822044B2 (en) * 2000-09-25 2006-09-13 株式会社東芝 Design verification system, design verification method, and computer-readable recording medium storing design verification program
CA2321346A1 (en) 2000-09-28 2002-03-28 Stephen K. Sunter Method, system and program product for testing and/or diagnosing circuits using embedded test controller access data
JP4574894B2 (en) * 2001-05-10 2010-11-04 株式会社アドバンテスト Program debugging device for semiconductor testing
DE10126591B4 (en) * 2001-05-31 2016-01-14 Polaris Innovations Ltd. Test device for dynamic memory modules
US6920461B2 (en) * 2001-07-10 2005-07-19 Microsoft Corp. Application program interface for network software platform
US6782336B2 (en) * 2001-09-17 2004-08-24 Hewlett-Packard Development Company, L.P. Test outputs using an idle bus
KR100442696B1 (en) * 2001-12-19 2004-08-02 삼성전자주식회사 Parallel testing system of semiconductor memory devices
US6976105B1 (en) * 2002-12-11 2005-12-13 Cypress Semiconductor Corp. Apparatus and method for attaching multiple devices to a host
TWI344595B (en) 2003-02-14 2011-07-01 Advantest Corp Method and structure to develop a test program for semiconductor integrated circuits

Patent Citations (37)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4807161A (en) * 1983-11-25 1989-02-21 Mars Incorporated Automatic test equipment
US5025205A (en) * 1989-06-22 1991-06-18 Texas Instruments Incorporated Reconfigurable architecture for logic test system
US5181201A (en) * 1990-02-07 1993-01-19 General Dynamics Land Systems Inc. Interface chip device
US5262716A (en) * 1992-04-21 1993-11-16 Hewlett-Packard Company Tester calibration procedure which includes fixturing
US5488573A (en) * 1993-09-02 1996-01-30 Matsushita Electric Industrial Co., Ltd. Method for generating test programs
US20020073371A1 (en) * 1995-04-28 2002-06-13 Whetsel Lee D. Dual mode memory for IC terminals
US5668745A (en) * 1995-10-20 1997-09-16 Lsi Logic Corporation Method and apparatus for testing of semiconductor devices
US5892949A (en) * 1996-08-30 1999-04-06 Schlumberger Technologies, Inc. ATE test programming architecture
US20020073375A1 (en) * 1997-06-03 2002-06-13 Yoav Hollander Method and apparatus for test generation during circuit design
US6028439A (en) * 1997-10-31 2000-02-22 Credence Systems Corporation Modular integrated circuit tester with distributed synchronization and control
US6195774B1 (en) * 1998-08-13 2001-02-27 Xilinx, Inc. Boundary-scan method using object-oriented programming language
US6601018B1 (en) * 1999-02-04 2003-07-29 International Business Machines Corporation Automatic test framework system and method in software component testing
US6427223B1 (en) * 1999-04-30 2002-07-30 Synopsys, Inc. Method and apparatus for adaptive verification of circuit designs
US6678643B1 (en) * 1999-06-28 2004-01-13 Advantest Corp. Event based semiconductor test system
US6405364B1 (en) * 1999-08-31 2002-06-11 Accenture Llp Building techniques in a development architecture framework
US20020138244A1 (en) * 1999-09-30 2002-09-26 Meyer Steven J. Simulator independent object code HDL simulation using PLI
US6629282B1 (en) * 1999-11-05 2003-09-30 Advantest Corp. Module based flexible semiconductor test system
US6970814B1 (en) * 2000-03-30 2005-11-29 International Business Machines Corporation Remote IP simulation modeling
US6651204B1 (en) * 2000-06-01 2003-11-18 Advantest Corp. Modular architecture for memory testing on event based test system
US20020059561A1 (en) * 2000-07-07 2002-05-16 Sun Microsystems, Inc. Software package verification
US6892328B2 (en) * 2000-09-29 2005-05-10 Tanisys Technology, Inc. Method and system for distributed testing of electronic devices
US6868513B1 (en) * 2000-10-26 2005-03-15 International Business Machines Corporation Automated multi-device test process and system
US20030005375A1 (en) * 2001-06-29 2003-01-02 Krech Alan S. Algorithmically programmable memory tester with test sites operating in a slave mode
US20030217343A1 (en) * 2002-04-11 2003-11-20 Rochit Rajsuman Manufacturing method and apparatus to avoid prototype-hold in ASIC/SOC manufacturing
US20030208747A1 (en) * 2002-05-06 2003-11-06 Sun Microsystems, Inc. Method for debugging an integrated circuit
US6779170B1 (en) * 2002-12-11 2004-08-17 Nvidia Corporation Method and apparatus for performing logic emulation
US20040225465A1 (en) * 2003-02-14 2004-11-11 Advantest Corporation Method and apparatus for testing integrated circuits
US20050022087A1 (en) * 2003-02-14 2005-01-27 Ankan Pramanick Method and system for controlling interchangeable components in a modular test system
US20050039079A1 (en) * 2003-02-14 2005-02-17 Shinsaku Higashi Test emulator, test module emulator, and record medium storing program therein
US20050154551A1 (en) * 2003-02-14 2005-07-14 Advantest Corporation Method and structure to develop a test program for semiconductor integrated circuits
US7184917B2 (en) * 2003-02-14 2007-02-27 Advantest America R&D Center, Inc. Method and system for controlling interchangeable components in a modular test system
US7209851B2 (en) * 2003-02-14 2007-04-24 Advantest America R&D Center, Inc. Method and structure to develop a test program for semiconductor integrated circuits
US20040210798A1 (en) * 2003-03-31 2004-10-21 Shinsaku Higashi Test emulator, test module emulator, and record medium storing program therein
US20040193990A1 (en) * 2003-03-31 2004-09-30 Seiji Ichiyoshi Test apparatus and test method
US7197416B2 (en) * 2004-05-22 2007-03-27 Advantest America R&D Center, Inc. Supporting calibration and diagnostics in an open architecture test system
US7210087B2 (en) * 2004-05-22 2007-04-24 Advantest America R&D Center, Inc. Method and system for simulating a modular test system
US7430486B2 (en) * 2004-05-22 2008-09-30 Advantest America R&D Center, Inc. Datalog support in a modular test system

Cited By (85)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7184917B2 (en) 2003-02-14 2007-02-27 Advantest America R&D Center, Inc. Method and system for controlling interchangeable components in a modular test system
US8255198B2 (en) 2003-02-14 2012-08-28 Advantest Corporation Method and structure to develop a test program for semiconductor integrated circuits
US7197417B2 (en) 2003-02-14 2007-03-27 Advantest America R&D Center, Inc. Method and structure to develop a test program for semiconductor integrated circuits
US20100192135A1 (en) * 2003-02-14 2010-07-29 Advantest Corporation Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits
US20050262412A1 (en) * 2004-05-22 2005-11-24 Advantest America R&D Center, Inc. Method and system for simulating a modular test system
US20050261855A1 (en) * 2004-05-22 2005-11-24 Advantest America R&D Center, Inc. Supporting calibration and diagnostics in an open architecture test system
US20050262414A1 (en) * 2004-05-22 2005-11-24 Advantest America R&D Center, Inc. Datalog support in a modular test system
US7430486B2 (en) 2004-05-22 2008-09-30 Advantest America R&D Center, Inc. Datalog support in a modular test system
US7197416B2 (en) * 2004-05-22 2007-03-27 Advantest America R&D Center, Inc. Supporting calibration and diagnostics in an open architecture test system
US7210087B2 (en) 2004-05-22 2007-04-24 Advantest America R&D Center, Inc. Method and system for simulating a modular test system
US20060090100A1 (en) * 2004-08-27 2006-04-27 Gerald Holzapfel Functional unit for carrying out logical test cases on a test system interconnected to a unit to be tested and corresponding method
US7676696B2 (en) * 2004-08-27 2010-03-09 Robert Bosch Gmbh Functional unit for carrying out logical test cases on a test system interconnected to a unit to be tested and corresponding method
US7457832B2 (en) * 2004-08-31 2008-11-25 Microsoft Corporation Verifying dynamically generated operations on a data store
US20060047658A1 (en) * 2004-08-31 2006-03-02 Microsoft Corporation Verifying dynamically generated operations on a data store
US20060062155A1 (en) * 2004-09-21 2006-03-23 Peter Hanping Chen Method for ip characterization and path finding, and computer readable recording medium for storing program thereof
US7516058B2 (en) * 2004-09-21 2009-04-07 Faraday Technology Corp. Method for IP characterization and path finding, and computer readable recording medium for storing program thereof
GB2418750A (en) * 2004-10-01 2006-04-05 Nec Technologies DLL component having export function through an interface
US8082541B2 (en) 2004-12-09 2011-12-20 Advantest Corporation Method and system for performing installation and configuration management of tester instrument modules
US20060130041A1 (en) * 2004-12-09 2006-06-15 Advantest Corporation Method and system for performing installation and configuration management of tester instrument modules
WO2006081869A1 (en) * 2004-12-23 2006-08-10 Airbus Deutschland Gmbh Device and method for testing components and systems
US20060195747A1 (en) * 2005-02-17 2006-08-31 Ankan Pramanick Method and system for scheduling tests in a parallel test system
US7543200B2 (en) 2005-02-17 2009-06-02 Advantest Corporation Method and system for scheduling tests in a parallel test system
US20060200816A1 (en) * 2005-03-02 2006-09-07 Advantest America R&D Center, Inc. Compact representation of vendor hardware module revisions in an open architecture test system
US8214800B2 (en) 2005-03-02 2012-07-03 Advantest Corporation Compact representation of vendor hardware module revisions in an open architecture test system
WO2006093327A1 (en) * 2005-03-02 2006-09-08 Advantest Corporation Compact representation of vendor hardware module revisions in an open architecture test system
US20090055803A1 (en) * 2005-05-20 2009-02-26 Advantest Corporation Semiconductor test program debug device
US8132161B2 (en) * 2005-05-20 2012-03-06 Advantest Corporation Semiconductor test program debug device
US20080291987A1 (en) * 2005-06-14 2008-11-27 Akihisa Kumaki Test Signal Generating Apparatus for Communications Equipment and Test Signal Generating Method for Communications Equipment
US7668234B2 (en) * 2005-06-14 2010-02-23 Anritsu Corp. Test signal generating apparatus for communications equipment and test signal generating method for communications equipment
US20070022349A1 (en) * 2005-07-07 2007-01-25 Agilent Technologies, Inc. Test apparatus with tester channel availability identification
US8069130B2 (en) 2006-04-04 2011-11-29 Optimaltest Ltd. Methods and systems for semiconductor testing using a testing scenario language
US20070233629A1 (en) * 2006-04-04 2007-10-04 Gil Balog Methods and systems for semiconductor testing using a testing scenario language
US7567947B2 (en) 2006-04-04 2009-07-28 Optimaltest Ltd. Methods and systems for semiconductor testing using a testing scenario language
US20070266288A1 (en) * 2006-05-15 2007-11-15 Erik Volkerink Re-configurable architecture for automated test equipment
US7590903B2 (en) * 2006-05-15 2009-09-15 Verigy (Singapore) Pte. Ltd. Re-configurable architecture for automated test equipment
US7777515B2 (en) 2006-07-05 2010-08-17 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US20080007284A1 (en) * 2006-07-05 2008-01-10 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US7532024B2 (en) 2006-07-05 2009-05-12 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US7679392B2 (en) 2006-07-05 2010-03-16 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US7737716B2 (en) 2006-07-05 2010-06-15 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US20090115445A1 (en) * 2006-07-05 2009-05-07 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US20090119048A1 (en) * 2006-07-05 2009-05-07 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US20090112501A1 (en) * 2006-07-05 2009-04-30 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US8131387B2 (en) * 2007-08-09 2012-03-06 Teradyne, Inc. Integrated high-efficiency microwave sourcing control process
US20090043526A1 (en) * 2007-08-09 2009-02-12 Yong Zhang Integrated high-efficiency microwave sourcing control process
US8140986B2 (en) 2007-09-27 2012-03-20 International Business Machines Corporation Generating test scenarios using reusable triggers indicating graphical user interface (GUI) elements and actions
US20090089688A1 (en) * 2007-09-27 2009-04-02 International Business Machines Corporation Generating test scenarios using reusable triggers indicating graphical user interface (gui) elements and actions
US20090119542A1 (en) * 2007-11-05 2009-05-07 Advantest Corporation System, method, and program product for simulating test equipment
DE102008022132A1 (en) 2008-05-05 2009-11-19 Airbus Deutschland Gmbh Method for configuring a test device, test method and test device
US20090276201A1 (en) * 2008-05-05 2009-11-05 Airbus Deutschland Gmbh Method For Configuring A Test Arrangement, Test Method And Test Arrangement
US8660832B2 (en) 2008-05-05 2014-02-25 Airbus Deutschland Gmbh Method for configuring a test arrangement, test method and test arrangement
US20110112790A1 (en) * 2008-07-07 2011-05-12 Eitan Lavie System and method for automatic hardware and software sequencing of computer-aided design (cad) functionality testing
US8589886B2 (en) * 2008-07-07 2013-11-19 Qualisystems Ltd. System and method for automatic hardware and software sequencing of computer-aided design (CAD) functionality testing
US20120173575A1 (en) * 2008-07-31 2012-07-05 Dustin Kurt Adler Record Based Code Structure
US20130193993A1 (en) * 2010-01-20 2013-08-01 Gil Golov Method and apparatus for testing a device-under-test
US9274175B2 (en) * 2010-01-20 2016-03-01 Advantest Corporation Method and apparatus for testing a device-under-test
US20120323973A1 (en) * 2011-06-16 2012-12-20 Hon Hai Precision Industry Co., Ltd. System and method for converting component data
US8825714B2 (en) * 2011-06-16 2014-09-02 Hon Hai Precision Industry Co., Ltd. System and method for converting component data
US20130042143A1 (en) * 2011-08-11 2013-02-14 Intel Mobile Communications Technology Dresden GmbH Circuit Arrangement and Method for Testing Same
US9311203B2 (en) * 2011-08-11 2016-04-12 Intel Deutschland Gmbh Circuit arrangement and method for testing same
US20150149106A1 (en) * 2011-08-31 2015-05-28 Teseda Corporation Field triage of eos failures in semiconductor devices
US9939488B2 (en) * 2011-08-31 2018-04-10 Teseda Corporation Field triage of EOS failures in semiconductor devices
US20130102091A1 (en) * 2011-10-25 2013-04-25 Teradyne, Inc. Test system supporting simplified configuration for controlling test block concurrency
US10048304B2 (en) * 2011-10-25 2018-08-14 Teradyne, Inc. Test system supporting simplified configuration for controlling test block concurrency
US20130231886A1 (en) * 2012-03-01 2013-09-05 Advantest Corporation Test apparatus and test module
US9342425B2 (en) * 2012-03-01 2016-05-17 Advantest Corporation Test apparatus and test module
US20160070631A1 (en) * 2013-04-09 2016-03-10 Eads Deutschland Gmbh Multiuser-Capable Test Environment for a Plurality of Test Objects
US10120771B2 (en) * 2013-04-09 2018-11-06 Airbus Defence and Space GmbH Multiuse-capable test environment for a plurality of test objects
US10320612B2 (en) * 2014-06-20 2019-06-11 Tellabs Operations, Inc. Method and apparatus for providing automatic node configuration using a dongle
US20150372866A1 (en) * 2014-06-20 2015-12-24 Tellabs Operations, Inc. Method and Apparatus for Providing Automatic Node Configuration Using A Dongle
US20160169954A1 (en) * 2014-12-12 2016-06-16 Airbus Defence and Space S.A. Method and system for performing electrical tests on complex devices
US10048307B2 (en) * 2014-12-12 2018-08-14 Airbus Defence and Space S.A. Method and system for performing electrical tests on complex devices
US20190220274A1 (en) * 2017-04-28 2019-07-18 Servicenow, Inc. Systems and methods for tracking configuration file changes
US10191736B2 (en) * 2017-04-28 2019-01-29 Servicenow, Inc. Systems and methods for tracking configuration file changes
US10776104B2 (en) * 2017-04-28 2020-09-15 Servicenow, Inc. Systems and methods for tracking configuration file changes
US20190277907A1 (en) * 2018-03-06 2019-09-12 Advantest Corporation Scalable platform for system level testing
CN110232015A (en) * 2018-03-06 2019-09-13 爱德万测试公司 Expansible platform for system level testing
US11002787B2 (en) * 2018-03-06 2021-05-11 Advantest Corporation Scalable platform for system level testing
US10811118B2 (en) 2018-06-12 2020-10-20 Samsung Electronics Co., Ltd. Test interface boards, test systems, and methods of operating test interface boards
US11156659B2 (en) * 2018-11-13 2021-10-26 Advantest Corporation Optimization and scheduling of the handling of devices in the automation process
US11159303B1 (en) 2018-11-20 2021-10-26 Mitsubishi Electric Corporation Communication system, list distribution station, communication method, and computer readable medium
US20190227915A1 (en) * 2019-03-29 2019-07-25 Intel Corporation Programmatically generating software test libraries for functional safety
US10866885B2 (en) * 2019-03-29 2020-12-15 Intel Corporation Programmatically generating software test libraries for functional safety
CN111611007A (en) * 2020-05-21 2020-09-01 掌阅科技股份有限公司 Script-based application program installation package packaging method and device
CN113051114A (en) * 2021-03-19 2021-06-29 无锡市软测认证有限公司 Method for improving chip testing efficiency

Also Published As

Publication number Publication date
US20050039079A1 (en) 2005-02-17
US20080010524A1 (en) 2008-01-10
US8255198B2 (en) 2012-08-28
DE602004012714D1 (en) 2008-05-08
US20100192135A1 (en) 2010-07-29
US20040225465A1 (en) 2004-11-11
US7437261B2 (en) 2008-10-14
US20080016396A1 (en) 2008-01-17
DE602004012714T2 (en) 2009-04-16
ATE390637T1 (en) 2008-04-15

Similar Documents

Publication Publication Date Title
US8255198B2 (en) Method and structure to develop a test program for semiconductor integrated circuits
US7197417B2 (en) Method and structure to develop a test program for semiconductor integrated circuits
US7209851B2 (en) Method and structure to develop a test program for semiconductor integrated circuits
US7184917B2 (en) Method and system for controlling interchangeable components in a modular test system
EP1592976B1 (en) Method and structure to develop a test program for semiconductor integrated circuits
JP4332200B2 (en) Method and modular test system for managing pattern object files in a modular test system
JP2007528993A5 (en)
KR20070035507A (en) Method and system for controlling interchangeable component in a modular test system
KR20070023762A (en) Method and structure to develop a test program for semiconductor integrated circuits

Legal Events

Date Code Title Description
AS Assignment

Owner name: ADVANTEST CORPORATION, JAPAN

Free format text: ASSIGNMENT OF ASSIGNORS INTEREST;ASSIGNORS:KRISHNASWAMY, RAMACHANDRAN;SINGH, HARSANJEET;PRAMANICK, ANKAN;AND OTHERS;REEL/FRAME:014807/0672;SIGNING DATES FROM 20040522 TO 20040601

STCB Information on status: application discontinuation

Free format text: ABANDONED -- FAILURE TO RESPOND TO AN OFFICE ACTION