IBIS and Timing File Preprocessor
The preprocessor is used in timing and IBIS files. This is a convenient way of handling parts that can programmatically configure either I/O buffers or timing and for handling multiple revisions or variants of parts that vary I/O buffers and timing.
In the part properties file, you can specify timing_options
and
IBIS_options
that use the preprocessor. The preprocessor lets you
parameterize strings and conditionally include or exclude sections in timing and IBIS
files.
Specify Preprocessor Parameters
To specify the IBIS_options
and timing_options
in
the parts properties, use the syntax:
ibis_option string1 string2 … timing_option string1 string2
A string is case sensitive and can be either of the form xyz
or
abc=def
. For example:
ibis_option xyz abc=def
In this example, both $xyz
and $abc
are defined.
The value of xyz
is NULL (blank) and the value of abc
is def
.
So in the IBIS file specified for this part, the string $xyz
is
replaced by a NULL (blank) and the string $abc
is replaced by
def
. Therefore, the IBIS record [Model] $abc
is
converted to [Model] def
Specify Conditional Statements
You can include or exclude sections of an IBIS file or timing file using an
if
, elseif
, else
, endif
construct. A conditional block consists of an if
statement
followed by any number of elseif
statements followed by up to one
else
statement and ended by a required endif
statement.
One of the following if
statements can start a conditional
block:
if <Boolean expression>
ifall <Boolean expression>
ifany <Boolean expression>
ifnone <Boolean expression>
One or more of the following elseif
statements are allowed:
elseif <Boolean expression>
elseifall <Boolean expression>
elseifany <Boolean expression>
elseifnone <Boolean expression>
One else
statement is allowed:
else
One endif
statement is required to end a conditional block:
endif
A Boolean expression consists of one or more Boolean fields. A Boolean field either
tests the existence of a parameter, compares two strings, or compares a clock domain
variable to a value. If a parameter exists, the value of a Boolean field is true. A Boolean
fields can compare two strings for equality (==
) or inequality
(!=
). In addition, the value of a Boolean field can be negated by
inserting an !
at the beginning of the field.
Each Boolean field can have either a true or false value. An if
,
ifall
, elseif
, or elseifall
statement is true if all of the Boolean fields in the Boolean expression are true. An
ifany
or elseifany
statement is true if any of the
Boolean fields in the Boolean expression are true. An ifnone
or
elseifnone
statement is true of all of the Boolean fields in the Boolean
expression are false.
For the ibis_option xyz abc=def
example, example Boolean field values
are:
Boolean Field | Value |
---|---|
$xyz | True |
$XYZ | False |
$abc | True |
$ruv | False |
!$xyz | False |
$xyz==def | False |
$abc==def | True |
$abc==DEF | False |
$abc!=def | False |
$abc!=$xyz | True |
!$abc==def | False |
For the ibis_option xyz abc=def
example, example Boolean expression
values are:
Boolean Expression | Value |
---|---|
if ($abc==def) | True |
if ($abc==def $xyz) | True |
ifnone ($xyz) | False |
ifany ($xyz $ruv) | True |
ifany (!$xyz $ruv) | False |
The Serial Link Designer or Parallel Link Designer app evaluates
the Boolean expression of each if
statement. The data records after the
first if
statement whose Boolean expression is true and up to the next
elseif
, else
, or endif
statement
are included. All other blocks are excluded, unless the Boolean expression of all
if
statements are false and there is an else
statement. In this case, the records between the else
and
endif
statements are included.
Conditional Block Example 1
For the ibis_option xyz abc=def
example, consider the conditional
block segment:
Sub-Block | Boolean Expression | Value |
---|---|---|
1 | if ($abc!=def) | False |
2 | elseif ($ruv) | False |
3 | elseif ($abc==def) | True |
4 | elseif ($xyz) | True |
5 | else | |
endif |
The statement in sub-block 3 is the first true if
or
elseif
statement, therefore sub-block 3 is included and all other
blocks are excluded.
Conditional Block Example 2
For the ibis_option xyz abc=def
example, consider the conditional
block segment:
Sub-Block | Boolean Expression | Value |
---|---|---|
1 | if ($abc!=def) | False |
2 | elseif ($ruv) | False |
3 | else | |
endif |
All of the if
and elseif
statements are false,
so the else
sub-block 3 is included.
Conditional Block Example 3
For the ibis_option xyz abc=def
example, consider the conditional
block segment:
Sub-Block | Boolean Expression | Value |
---|---|---|
1 | if ($abc!=def) | False |
2 | elseif ($ruv) | False |
endif |
All of the if
and elseif
statements are false
and since there is no else
statement, none of the blocks in the this
condition block are included.
Pass Information to Clock Domain File
The preprocessor keyword $clock_domain(domain)
is used in the timing
file to pass a variable to a parameter definition in the clock domain file. It can also be
combined with other pre-processing parameters.
Syntax:
<param_name> = $clock_domain(<domain>)
Or, in a boolean field:
$clock_domain(<name>)==<value>
where <name>
is the name of a clock domain defined in the clock
domain file.
Preprocessor Examples
Parts Properties and Timing File
In the part properties:
timing_option delay=1. phase=2 clock=.5
In the timing file:
PARAMS: if ($phase==1) DATA_DELAY = $delay - $clock elseif ($phase==2) DATA_DELAY = $delay + $clock else DATA_DELAY = $delay endif END_PARAMS
Clock Domain and Timing File
In the clock_domain.txt
file:
ddr_data_rate = 4ns
In the timing file:
BIT_TIME = $clock_domain(ddr_data_rate) DDR_ADDR_DELAY = BIT_TIME * 2 OR DDR_ADDR_DELAY = $clock_domain(ddr_data_rate) * 2
See Also
Serial Link Designer | Parallel Link Designer