2001-03-22 06:08:00 +01:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
|
|
|
|
*
|
2002-08-27 07:39:57 +02:00
|
|
|
* $Id: opcodes.txt,v 1.38 2002/08/27 05:39:57 steve Exp $
|
2001-03-22 06:08:00 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
2001-03-11 01:29:38 +01:00
|
|
|
|
|
|
|
|
EXECUTABLE INSTRUCTION OPCODES
|
|
|
|
|
|
|
|
|
|
Instruction opcodes all start with a % character and have 0 or more
|
2001-03-30 06:55:22 +02:00
|
|
|
operands. In no case are there more then 3 operands. This chapter
|
|
|
|
|
describes the specific behavior of each opcode, in hopefully enough
|
|
|
|
|
detail that its complete effect can be predicted.
|
2001-03-11 01:29:38 +01:00
|
|
|
|
2001-05-24 06:20:10 +02:00
|
|
|
General principles of Arithmetic:
|
|
|
|
|
|
|
|
|
|
The binary arithmetic instruction in general take three parameters,
|
|
|
|
|
the left operand, the right operand, and the base. The left operand is
|
|
|
|
|
replaced with the result, which is the same width as the left and
|
|
|
|
|
right operands.
|
|
|
|
|
|
|
|
|
|
|
2001-03-31 03:59:58 +02:00
|
|
|
* %add <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction adds the right vector into the left vector, the
|
|
|
|
|
vectors having the width <wid>. If any of the bits of either vector
|
|
|
|
|
are x or z, the result is x. Otherwise, the result is the arithmetic
|
|
|
|
|
sum.
|
2001-03-11 01:29:38 +01:00
|
|
|
|
2001-05-02 03:57:25 +02:00
|
|
|
See also the %sub instruction.
|
|
|
|
|
|
2002-05-29 18:29:34 +02:00
|
|
|
* %addi <bit-l>, <imm>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction adds the immediate value (no x or z bits) into the
|
|
|
|
|
left vector. The imm value is limited to 16 significant bits, but it
|
|
|
|
|
is zero extended to match any width.
|
|
|
|
|
|
2001-04-01 08:12:13 +02:00
|
|
|
* %and <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
Perform the bitwise AND of the two vectors, and store the result in
|
|
|
|
|
the left vector. Each bit is calculated independent of other bits. AND
|
|
|
|
|
means the following:
|
|
|
|
|
|
|
|
|
|
0 and ? --> 0
|
|
|
|
|
? and 0 --> 0
|
|
|
|
|
1 and 1 --> 1
|
|
|
|
|
otherwise x
|
|
|
|
|
|
2001-03-11 01:29:38 +01:00
|
|
|
* %assign <var-label>, <delay>, <bit>
|
2002-04-22 00:29:49 +02:00
|
|
|
* %assign/d <var-label>, <delay>, <bit>
|
2001-03-11 01:29:38 +01:00
|
|
|
|
|
|
|
|
This does a non-blocking assignment to a variable. The <label>
|
|
|
|
|
identifies the affected variable, and the <delay> gives the delay when
|
|
|
|
|
the assignment takes place. The delay may be 0. For blocking
|
|
|
|
|
assignments, see %set. The <bit> is the address of the thread register
|
|
|
|
|
that contains the bit value to assign.
|
|
|
|
|
|
2002-04-22 00:29:49 +02:00
|
|
|
The %assign/d instruction is exactly the same as the %assign
|
|
|
|
|
instruction, except that the <delay> specifies one of the index
|
|
|
|
|
registers, that contain a calculated delay.
|
|
|
|
|
|
2001-05-03 01:16:50 +02:00
|
|
|
|
|
|
|
|
* %assign/m <memory-label>, <delay>, <bit>
|
|
|
|
|
|
|
|
|
|
This instruction does a non-blocking assignment to a bit in a memory
|
|
|
|
|
from the specified thread register <bit>. The memory bit is addressed
|
|
|
|
|
by index register 3. Bit address zero is the LSB of the first memory
|
|
|
|
|
word.
|
|
|
|
|
|
|
|
|
|
|
2001-08-27 00:59:32 +02:00
|
|
|
* %assign/x0 <var-label>, <delay>, <bit>
|
|
|
|
|
|
|
|
|
|
This does a non-blocking assignment to a functor, similar to the
|
|
|
|
|
%assign instruction. The <var-label> identifies the base functor of
|
|
|
|
|
the affected variable, and the <delay> gives the delay when the
|
|
|
|
|
assignment takes place. The delay may be 0. The actual functor used is
|
|
|
|
|
calculated by using <var-label> as a base, and indexing with the
|
|
|
|
|
index[0] index register. This supports indexed assignment.
|
|
|
|
|
|
|
|
|
|
The <bit> is the address of the thread register that contains the bit
|
|
|
|
|
value to assign.
|
|
|
|
|
|
|
|
|
|
|
2002-08-22 05:38:40 +02:00
|
|
|
* %blend <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction blends the bits of a vector into the destination in a
|
|
|
|
|
manner like the expression (x ? <a> : <b>). The truth table is:
|
|
|
|
|
|
|
|
|
|
1 1 --> 1
|
|
|
|
|
0 0 --> 0
|
|
|
|
|
z z --> z
|
|
|
|
|
x x --> x
|
|
|
|
|
.... --> x
|
|
|
|
|
|
|
|
|
|
In other words, if the bits are identical, then take that
|
|
|
|
|
value. Otherwise, the value is x.
|
|
|
|
|
|
2001-05-06 01:55:46 +02:00
|
|
|
* %breakpoint
|
|
|
|
|
|
|
|
|
|
This instruction unconditionally breaks the simulator into the
|
|
|
|
|
interactive debugger. The idea is to stop the simulator here and give
|
|
|
|
|
the user a chance to display the state of the simulation using
|
|
|
|
|
debugger commands.
|
|
|
|
|
|
|
|
|
|
This may not work on all platforms. If run-time debugging is compiled
|
|
|
|
|
out, then this function is a no-op.
|
|
|
|
|
|
|
|
|
|
|
2001-11-01 04:00:19 +01:00
|
|
|
* %cassign <var-label>, <expr-label>
|
|
|
|
|
|
|
|
|
|
Connect and active a procedural continuous assignment to a
|
|
|
|
|
variable. The <var-label> identifies the affected variable, and the
|
|
|
|
|
<expr-label> is the functor that drives the expression to the
|
|
|
|
|
variable. This opcode affects only a single bit.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* %deassign <var-label>, <wid>
|
|
|
|
|
|
|
|
|
|
Deactive and disconnect a procedural continuous assignment to a
|
|
|
|
|
variable. The <var-label> identifies the affected variable. <wid>
|
|
|
|
|
specifies the how many bits to deassign.
|
|
|
|
|
|
|
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
* %cmp/u <bit-l>, <bit-r>, <wid>
|
|
|
|
|
* %cmp/s <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
These instructions perform a generic comparison of two vectors of equal
|
|
|
|
|
size. The <bit-l> and <bit-r> numbers address the least-significant
|
2001-05-01 07:00:02 +02:00
|
|
|
bit of each vector, and <wid> is the width. If either operand is 0,
|
2001-03-22 06:08:00 +01:00
|
|
|
1, 2 or 3 then it is taken to be a constant replicated to the selected
|
|
|
|
|
width.
|
|
|
|
|
|
|
|
|
|
The results of the comparison go into bits 4, 5, 6 and 7:
|
|
|
|
|
|
|
|
|
|
4: eq (equal)
|
|
|
|
|
5: lt (less than)
|
|
|
|
|
6: eeq (case equal)
|
|
|
|
|
|
|
|
|
|
The eeq bit is set to 1 if all the bits in the vectors are exactly the
|
|
|
|
|
same, or 0 otherwise. The eq bit is true if the values are logically
|
|
|
|
|
the same. That is, x and z are considered equal. In other words the eq
|
|
|
|
|
bit is the same as ``=='' and the eeq bit ``===''.
|
|
|
|
|
|
|
|
|
|
The lt bit is 1 if the left vector is less then the right vector, or 0
|
|
|
|
|
if greater then or equal to the right vector. It is the equivilent of
|
|
|
|
|
the Verilog < operator. Combinations of these three bits can be used
|
|
|
|
|
to implement all the Verilog comparison operators.
|
|
|
|
|
|
|
|
|
|
The %cmp/u and %cmp/s differ only in the handling of the lt bit. The
|
|
|
|
|
%cmp/u does an unsigned compare, whereas the %cmp/s does a signed
|
2001-05-01 07:00:02 +02:00
|
|
|
compare. In either case, if either operand constains x or z, then lt
|
|
|
|
|
bit gets the x value.
|
2001-03-22 06:08:00 +01:00
|
|
|
|
|
|
|
|
* %cmp/z <bit-l>, <bit-r>, <wid>
|
|
|
|
|
* %cmp/x <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
These instructions are for implementing the casez and casex
|
|
|
|
|
comparisons. These work similar to the %cmp/u instructions, except
|
|
|
|
|
only an eq bit is calculated. These comparisons both treat z values in
|
|
|
|
|
the left or right operand as don't care positions. The %cmp/x
|
|
|
|
|
instruction will also treat x values in either operand as don't care.
|
|
|
|
|
|
|
|
|
|
Only bit 4 is set by these instructions.
|
|
|
|
|
|
2001-03-11 01:29:38 +01:00
|
|
|
* %delay <delay>
|
|
|
|
|
|
|
|
|
|
This opcode pauses the thread, and causes it to be rescheduled for a
|
|
|
|
|
time in the future. The <amount> is the number of the ticks in the
|
|
|
|
|
future to reschedule, and is >= 0. If the %delay is zero, then the
|
|
|
|
|
thread yields the processor for another thread, but will be resumed in
|
|
|
|
|
the current time step.
|
|
|
|
|
|
2001-07-19 06:40:55 +02:00
|
|
|
* %delayx <idx>
|
|
|
|
|
|
|
|
|
|
This is similar to the %delay opcode, except that the parameter
|
|
|
|
|
selects an index register, which contains the actual delay. This
|
|
|
|
|
supports run-time calculated delays.
|
|
|
|
|
|
2001-04-18 06:21:23 +02:00
|
|
|
* %disable <scope-label>
|
|
|
|
|
|
|
|
|
|
This instruction terminates threads that are part of a specific
|
|
|
|
|
scope. The label identifies the scope in question, and the threads are
|
|
|
|
|
the threads that are currently within that scope.
|
|
|
|
|
|
|
|
|
|
|
2001-10-16 03:26:54 +02:00
|
|
|
* %div <bit-l>, <bit-r>, <wid>
|
2002-04-14 20:41:34 +02:00
|
|
|
* %div/s <bit-l>, <bit-r>, <wid>
|
2001-10-16 03:26:54 +02:00
|
|
|
|
|
|
|
|
This instruction arithmetically divides the <bit-l> vector by the
|
|
|
|
|
<bit-r> vector, and leaves the result in the <bit-l> vector. IF any of
|
|
|
|
|
the bits in either vector are x or z, the entire result is x.
|
|
|
|
|
|
2002-04-14 20:41:34 +02:00
|
|
|
The %div/s instruction is the same as %div, but does signed division.
|
|
|
|
|
|
2001-10-16 03:26:54 +02:00
|
|
|
|
2001-11-01 04:00:19 +01:00
|
|
|
* %force <fofu-label>, <width>
|
|
|
|
|
|
|
|
|
|
Activate a force represented by the force functors <fofu-label>, which
|
|
|
|
|
were created with a .force directive. If any force was active on the
|
|
|
|
|
signal, that force is released first. A vector of force functors may
|
|
|
|
|
be specified with <width> greater than 1.
|
|
|
|
|
|
|
|
|
|
|
2001-04-18 06:21:23 +02:00
|
|
|
* %fork <code-label>, <scope-label>
|
2001-03-30 06:55:22 +02:00
|
|
|
|
|
|
|
|
This instruction is similar to %jmp, except that it creates a new
|
|
|
|
|
thread to start executing at the specified address. The new thread is
|
|
|
|
|
created and pushed onto the child stack. It is also marked runnable,
|
|
|
|
|
but is not necessarily started until the current thread yields.
|
|
|
|
|
|
|
|
|
|
The %fork instruction has no effect other then to push a child thread.
|
|
|
|
|
|
|
|
|
|
See also %join.
|
|
|
|
|
|
|
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
* %inv <bit>, <wid>
|
|
|
|
|
|
2001-03-30 06:55:22 +02:00
|
|
|
Perform a bitwise invert of the vector starting at <bit>. The result
|
|
|
|
|
replaces the input. Invert means the following, independently for each
|
|
|
|
|
bit:
|
|
|
|
|
|
|
|
|
|
0 --> 1
|
|
|
|
|
1 --> 0
|
|
|
|
|
x --> x
|
|
|
|
|
z --> x
|
|
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
|
2001-05-06 19:42:22 +02:00
|
|
|
* %ix/get <idx>, <bit>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction loads a thread vector starting at <bit>, size <wid>,
|
|
|
|
|
into the index register <idx>. The <bit> is the lsb of the value in
|
|
|
|
|
thread bit space, and <wid> is the width of the vector.
|
|
|
|
|
|
|
|
|
|
The function converts the 4-value bits into a binary number, without
|
|
|
|
|
sign extension. If any of the bits of the vector is x or z, then the
|
2002-08-27 07:39:57 +02:00
|
|
|
index register gets the value 0.
|
|
|
|
|
|
|
|
|
|
The function also writes into bit 4 a 1 if any of the bits of the
|
|
|
|
|
input vector are x or z. This is a flag that the 0 value written into
|
|
|
|
|
the index register is really the result of calculating from unknown
|
|
|
|
|
bits.
|
|
|
|
|
|
|
|
|
|
4: unknown value
|
|
|
|
|
5: (reserved)
|
|
|
|
|
6: (reserved)
|
2001-05-06 19:42:22 +02:00
|
|
|
|
|
|
|
|
|
2001-05-01 07:00:02 +02:00
|
|
|
* %ix/load <idx>, <value>
|
|
|
|
|
|
|
|
|
|
This instruction loads an immediate value into the addressed index
|
|
|
|
|
register. The index register holds numeric values, so the <value> is a
|
|
|
|
|
number. The idx value selects the index register, and may be 0, 1, 2
|
2001-05-06 19:42:22 +02:00
|
|
|
or 3. This is different from %is/get, which loads the index register
|
|
|
|
|
from a value in the thread bit vector.
|
2001-05-01 07:00:02 +02:00
|
|
|
|
|
|
|
|
|
2001-05-03 01:16:50 +02:00
|
|
|
* %ix/add <idx>, <value>
|
|
|
|
|
* %ix/sub <idx>, <value>
|
|
|
|
|
* %ix/mul <idx>, <value>
|
|
|
|
|
|
|
|
|
|
This instruction adds, subtracts, or multiplies an immediate value to
|
|
|
|
|
the addressed index register. The index register holds numeric values,
|
|
|
|
|
so the <value> is a number. The <idx> value selects the index register,
|
|
|
|
|
and may be 0, 1, 2 or 3.
|
|
|
|
|
|
|
|
|
|
|
2001-03-20 07:16:23 +01:00
|
|
|
* %jmp <code-label>
|
|
|
|
|
|
|
|
|
|
The %jmp instruction performs an unconditional branch to a given
|
|
|
|
|
location. The parameter is the label of the destination instruction.
|
|
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
* %jmp/[01xz] <code-label>, <bit>
|
|
|
|
|
|
|
|
|
|
This is a conditional version of the %jmp instruction. In this case,
|
|
|
|
|
a single bit (addressed by <bit>) is tested. If it is one of the
|
|
|
|
|
values in the part after the /, the jump is taken. For example:
|
|
|
|
|
|
|
|
|
|
%jmp/xz T_label, 8;
|
|
|
|
|
|
|
|
|
|
will jump to T_label if bit 8 is x or z.
|
|
|
|
|
|
2001-03-30 06:55:22 +02:00
|
|
|
* %join
|
|
|
|
|
|
|
|
|
|
This is the partner to %fork. This instruction causes the thread to
|
|
|
|
|
wait for the top thread in the child stack to terminate, then
|
|
|
|
|
continues. It has no effect in the current thread other then to wait
|
|
|
|
|
until the top child is cleared.
|
|
|
|
|
|
|
|
|
|
It is an error to execute %join if there are no children in the child
|
2001-05-01 07:00:02 +02:00
|
|
|
stack. Every %join in the thread must have a matching %fork that
|
|
|
|
|
spawned off a child thread.
|
2001-03-30 06:55:22 +02:00
|
|
|
|
2001-05-01 07:00:02 +02:00
|
|
|
If the matching child instruction is still running, a %join suspends
|
|
|
|
|
the calling thread until the child ends. If the child is already
|
|
|
|
|
ended, then the %join does not block or yield the thread.
|
2001-03-30 06:55:22 +02:00
|
|
|
|
|
|
|
|
|
2001-03-11 01:29:38 +01:00
|
|
|
* %load <bit>, <functor-label>
|
|
|
|
|
|
|
|
|
|
This instruction loads a value from the given functor output into the
|
2001-05-01 07:00:02 +02:00
|
|
|
specified thread register bit. The functor-label can refer to a .net,
|
|
|
|
|
a .var or a .functor, and may be indexed with array syntax to get at a
|
|
|
|
|
functor within a vector of functors. This instruction loads only a
|
|
|
|
|
single bit.
|
|
|
|
|
|
2001-03-11 01:29:38 +01:00
|
|
|
|
2001-05-03 01:16:50 +02:00
|
|
|
* %load/m <bit>, <memory-label>
|
|
|
|
|
|
|
|
|
|
This instruction loads a value from a memory bit into the specified
|
|
|
|
|
thread register bit. The memory bit is addressed by index register 3.
|
|
|
|
|
Bit address zero is the LSB of the first memory word. This
|
|
|
|
|
instruction loads only a single bit.
|
|
|
|
|
|
|
|
|
|
|
2001-07-22 02:04:50 +02:00
|
|
|
* %load/x <bit>, <functor-label>, <idx>
|
|
|
|
|
|
|
|
|
|
This is an indexed load. It uses the contents of the specified index
|
|
|
|
|
register to select a bit from an array based at <functor-label>. The
|
|
|
|
|
bit is pulled from the addressed functor and loaded into the
|
|
|
|
|
destination bit. This function does not do any bounds checking.
|
|
|
|
|
|
|
|
|
|
|
2001-05-24 06:20:10 +02:00
|
|
|
* %mod <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction calculates the modulus %r of the left operand, and
|
|
|
|
|
replaces the left operand with the result. The <wid> gives the width
|
|
|
|
|
of the left and the right vectors, and the left vector is completely
|
|
|
|
|
replaced with the result.
|
|
|
|
|
|
2001-10-16 03:26:54 +02:00
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
* %mov <dst>, <src>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction copies a vector from one place in register space to
|
|
|
|
|
another. The destination and source vectors are assumed to be the same
|
|
|
|
|
width and non-overlapping. The <dst> may not be 0-3, but if the <src>
|
|
|
|
|
is one of the 4 constant bits, the effect is to replicate the value
|
2001-05-01 07:00:02 +02:00
|
|
|
into the destination vector. This is useful for filling a vector.
|
|
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
|
2001-06-17 01:45:05 +02:00
|
|
|
* %mul <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction multiplies the left vector by the right vector, the
|
|
|
|
|
vectors having the width <wid>. If any of the bits of either vector
|
|
|
|
|
are x or z, the result is x. Otherwise, the result is the arithmetic
|
|
|
|
|
product.
|
|
|
|
|
|
|
|
|
|
|
2002-05-31 22:04:22 +02:00
|
|
|
* %muli <bit-l>, <imm>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction is the same as %mul, but the second operand is an
|
|
|
|
|
immediate value that is padded to the width of the result.
|
|
|
|
|
|
|
|
|
|
|
2001-04-02 00:25:33 +02:00
|
|
|
* %nor/r <dst>, <src>, <wid>
|
|
|
|
|
|
|
|
|
|
The %nor/r instruction is a reduction nor. That is, the <src> is a
|
|
|
|
|
vector with width, but the result is a single bit. The <src> vector is
|
2001-05-01 07:00:02 +02:00
|
|
|
not affected by the operation unless the <dst> bit is within the
|
|
|
|
|
vector. The result is calculated before the <dst> bit is written, so
|
|
|
|
|
it is valid to place the <dst> within the <src>.
|
|
|
|
|
|
|
|
|
|
The actual operation performed is the inverted or of all the bits in
|
|
|
|
|
the vector.
|
|
|
|
|
|
2001-04-02 00:25:33 +02:00
|
|
|
|
2001-04-01 09:22:08 +02:00
|
|
|
* %or <dst>, <src>, <wid>
|
|
|
|
|
|
2001-05-01 07:00:02 +02:00
|
|
|
Perform the bitwise or of the vectors. Each bit in the <dst> is
|
|
|
|
|
combined with the corresponding bit in the source, according to the
|
|
|
|
|
truth table:
|
2001-04-01 09:22:08 +02:00
|
|
|
|
|
|
|
|
1 or ? --> 1
|
|
|
|
|
? or 1 --> 1
|
|
|
|
|
0 or 0 --> 0
|
|
|
|
|
otherwise x
|
|
|
|
|
|
2001-11-01 04:00:19 +01:00
|
|
|
|
2001-10-10 06:48:12 +02:00
|
|
|
* %or/r <dst>, <src>, <wid>
|
|
|
|
|
|
|
|
|
|
This is a reduction version of the %or opcode. The <src> is a vector,
|
|
|
|
|
and the <dst> is a writeable scaler. The <dst> gets the value of the
|
|
|
|
|
or of all the bits of the src vector.
|
|
|
|
|
|
2001-05-01 07:00:02 +02:00
|
|
|
|
2001-11-01 04:00:19 +01:00
|
|
|
* %release <functor-label>
|
|
|
|
|
|
|
|
|
|
Release the force on the signal that is represented by the functor
|
|
|
|
|
<functor-label>. The force was previously activated with a %force
|
|
|
|
|
statement. If no force was active on this functor the statement does
|
|
|
|
|
nothing. %release restores and propagates the normal value of the
|
|
|
|
|
previously forced functor. In case of a forced Verilog register, the
|
|
|
|
|
current value of the force expression should be %set to the .var
|
|
|
|
|
functor before the force is released, to comply with Verilog release
|
|
|
|
|
semantics. Like:
|
|
|
|
|
|
|
|
|
|
%load <bit>, <functor-label> ; get the forced value
|
|
|
|
|
%set <functor-label>, <bit> ; set the .var value
|
|
|
|
|
%release <functor-label> ; remove the force
|
|
|
|
|
|
|
|
|
|
|
2001-03-11 01:29:38 +01:00
|
|
|
* %set <var-label>, <bit>
|
|
|
|
|
|
|
|
|
|
This sets a bit of a variable, and is used to implement blocking
|
|
|
|
|
assignments. The <label> identifies the variable to receive the new
|
|
|
|
|
value. Once the set completes, the value is immediately available to
|
|
|
|
|
be read out of the variable. The <bit> is the address of the thread
|
|
|
|
|
register that contains the bit value to assign.
|
|
|
|
|
|
2001-05-02 03:57:25 +02:00
|
|
|
|
2001-05-03 01:16:50 +02:00
|
|
|
* %set/m <memory-label>, <bit>
|
|
|
|
|
|
|
|
|
|
This instruction set a bit in a memory from the specified thread
|
|
|
|
|
register bit. The memory bit is addressed by index register 3. Bit
|
|
|
|
|
address zero is the LSB of the first memory word. This instruction
|
|
|
|
|
sets only a single bit.
|
|
|
|
|
|
|
|
|
|
|
2001-08-27 00:59:32 +02:00
|
|
|
* %set/x <var-label>, <bit>, <idx>
|
|
|
|
|
|
|
|
|
|
This sets the bit of a variable functor, the address calculated by
|
|
|
|
|
using the index register <idx> (0, 1, 2 or 3) to index the functor
|
|
|
|
|
address of <var-label>.
|
|
|
|
|
|
2002-01-26 03:08:07 +01:00
|
|
|
If the index value in index register <idx> is <0 (for example if
|
|
|
|
|
%ix/get converted an unknown value into the register) then the set is
|
|
|
|
|
not performed.
|
|
|
|
|
|
2001-08-27 00:59:32 +02:00
|
|
|
|
2001-06-23 20:26:26 +02:00
|
|
|
* %shiftl/i0 <bit>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction shifts the vector left (towards more significant
|
|
|
|
|
bits) by the amount in index register 0. The <bit> is the address of
|
|
|
|
|
the lsb of the vector, and <wid> the width of the vector. The shift is
|
|
|
|
|
done in place. Zero values are shifted in.
|
|
|
|
|
|
2001-06-30 23:07:26 +02:00
|
|
|
* %shiftr/i0 <bit>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction shifts the vector right (towards the less significant
|
|
|
|
|
bits) by the amount in the index register 0. The <bit> is the address
|
|
|
|
|
of the lsb of the vector, and <wid> is the width of the vector. The
|
|
|
|
|
shift is done in place.
|
|
|
|
|
|
|
|
|
|
This is an unsigned down shift, so zeros are shifted into the top bits.
|
|
|
|
|
|
2001-05-02 03:57:25 +02:00
|
|
|
* %sub <bit-l>, <bit-r>, <wid>
|
|
|
|
|
|
|
|
|
|
This instruction arithmetically subtracts the right vector out of the
|
|
|
|
|
left vector. It accomplishes this by adding to the left vector 1 plus
|
|
|
|
|
the 1s complement of the right vector. The carry value is dropped, and
|
|
|
|
|
the result, placed in <bit-l>, is the subtraction of <bit-r> from the
|
|
|
|
|
input <bit-l>. Both vectors have the same width. If any bits in either
|
|
|
|
|
operand are x, then the entire result is x.
|
|
|
|
|
|
|
|
|
|
See also the %add instruction.
|
|
|
|
|
|
|
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
* %vpi_call <name> [, ...]
|
|
|
|
|
|
2001-05-20 02:46:12 +02:00
|
|
|
This instruction makes a call to a system task that was declared using
|
|
|
|
|
VPI. The operands are compiled down to a vpiHandle for the call. The
|
|
|
|
|
instruction contains only the vpiHandle for the call. See the vpi.txt
|
|
|
|
|
file for more on system task/function calls.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* %vpi_func <name>, <dst>, <wid> [, ...]
|
|
|
|
|
|
|
|
|
|
This instruction is similar to %vpi_call, except that it is for
|
|
|
|
|
calling system functions. The difference here is the <dst> and <wid>
|
|
|
|
|
parameters that specify where the return value is to go. The normal
|
|
|
|
|
means that the VPI code uses to write the return value causes those
|
|
|
|
|
bits to go here.
|
2001-03-16 02:44:34 +01:00
|
|
|
|
2001-05-01 07:00:02 +02:00
|
|
|
|
2001-03-26 06:00:39 +02:00
|
|
|
* %wait <functor-label>
|
2001-03-11 01:29:38 +01:00
|
|
|
|
2001-03-16 02:44:34 +01:00
|
|
|
When a thread executes this instruction, it places itself in the
|
|
|
|
|
sensitive list for the addressed functor. The functor holds all the
|
|
|
|
|
threads that await the functor. When the defined sort of event occurs
|
|
|
|
|
on the functor, a thread schedule event is created for all the threads
|
|
|
|
|
in its list and the list is cleared.
|
2001-03-22 06:08:00 +01:00
|
|
|
|
2001-04-15 06:07:56 +02:00
|
|
|
* %xnor <dst>, <src>, <wid>
|
|
|
|
|
|
|
|
|
|
This does a bitwise exclusive nor (~^) of the <src> and <dst> vector,
|
|
|
|
|
and leaves the result in the <dst> vector. xnor is this:
|
|
|
|
|
|
|
|
|
|
0 xnor 0 --> 1
|
|
|
|
|
0 xnor 1 --> 0
|
|
|
|
|
1 xnor 0 --> 0
|
|
|
|
|
1 xnor 1 --> 1
|
|
|
|
|
otherwise x
|
|
|
|
|
|
2001-04-15 18:37:48 +02:00
|
|
|
|
|
|
|
|
* %xor <dst>, <src>, <wid>
|
|
|
|
|
|
|
|
|
|
This does a bitwise exclusive or (^) of the <src> and <dst> vector,
|
|
|
|
|
and leaves the result in the <dst> vector. xor is this:
|
|
|
|
|
|
|
|
|
|
0 xnor 0 --> 0
|
|
|
|
|
0 xnor 1 --> 1
|
|
|
|
|
1 xnor 0 --> 1
|
|
|
|
|
1 xnor 1 --> 0
|
|
|
|
|
otherwise x
|
|
|
|
|
|
|
|
|
|
|
2001-03-22 06:08:00 +01:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
|
|
|
|
*
|
|
|
|
|
* This source code is free software; you can redistribute it
|
|
|
|
|
* and/or modify it in source code form under the terms of the GNU
|
|
|
|
|
* General Public License as published by the Free Software
|
|
|
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
|
|
|
*/
|