Class SubMultiplication
Implements binary multiplication for two numbers a, b stored in the same chain.
Computes a new binary number c := a * b. If the binary representation of
c does not fit into the chain, only the lowermost bits are computed and an
overflow is detected.
This procedure requires at least 2 pins and it always uses the 2 "outermost / leftmost" pins when traversing the chain. If an amoebot occurs on the chain multiple times, its predecessor and successor directions must be different for all occurrences.
Usage:
-
Establish a chain of amoebots such that each amoebot knows its predecessor and successor
(except the start and end amoebots). Each amoebot should store a bit
aand a bitb. The highest-value 1-bit ofamust be marked. -
Initialize using the Init(bool, bool, bool, Direction, Direction) method.
You must pass the bits
aandb, the marked MSB ofaand the two directions. The start should have no predecessor and the end should have no successor. - Call SetupPinConfig(PinConfiguration) to modify the pin configuration.
- Call ActivateSend() in the same round to start the procedure.
- After this, call ActivateReceive(), SetupPinConfig(PinConfiguration), and ActivateSend() in this order in every round.
- The procedure can be paused after each ActivateReceive() call and resumed by continuing with SetupPinConfig(PinConfiguration) in some future round.
- Call IsFinished() after ActivateReceive() to check whether the multiplication is finished.
-
You can read the result bit
cusing Bit_C(). After each iteration, you can also read the bitaand the shifted bitbusing Bit_A() and Bit_C(). -
If an overflow has occurred, HaveOverflow() will return
trueafter the procedure has finished.
Namespace: AS2.Subroutines.BinaryOps
Assembly: .dll
Syntax
public class SubMultiplication : Subroutine
Constructors
| Edit this page View SourceSubMultiplication(Particle, ParticleAttribute<int>)
Declaration
public SubMultiplication(Particle p, ParticleAttribute<int> stateAttr = null)
Parameters
| Type | Name | Description |
|---|---|---|
| Particle | p | |
| ParticleAttribute<int> | stateAttr |
Fields
| Edit this page View Sourcebit_A
Declaration
private const int bit_A = 2
Field Value
| Type | Description |
|---|---|
| int |
bit_Add
Declaration
private const int bit_Add = 14
Field Value
| Type | Description |
|---|---|
| int |
bit_B
Declaration
private const int bit_B = 3
Field Value
| Type | Description |
|---|---|
| int |
bit_C
Declaration
private const int bit_C = 4
Field Value
| Type | Description |
|---|---|
| int |
bit_Finished
Declaration
private const int bit_Finished = 13
Field Value
| Type | Description |
|---|---|
| int |
bit_MSB_A
Declaration
private const int bit_MSB_A = 6
Field Value
| Type | Description |
|---|---|
| int |
bit_Overflow
Declaration
private const int bit_Overflow = 15
Field Value
| Type | Description |
|---|---|
| int |
bit_ShiftError
Declaration
private const int bit_ShiftError = 16
Field Value
| Type | Description |
|---|---|
| int |
bit_Token
Declaration
private const int bit_Token = 5
Field Value
| Type | Description |
|---|---|
| int |
state
Declaration
private ParticleAttribute<int> state
Field Value
| Type | Description |
|---|---|
| ParticleAttribute<int> |
Methods
| Edit this page View SourceActivateReceive()
Activation during ActivateBeep() to receive the beeps sent in the last round. Should always be called before SetupPinConfig(PinConfiguration) and ActivateSend(), except in the very first activation, where it should not be called.
Declaration
public void ActivateReceive()
ActivateSend()
Activation during ActivateBeep() to send the beeps required for this step. Must be called after ActivateReceive() and SetupPinConfig(PinConfiguration).
Declaration
public void ActivateSend()
Bit_A()
This amoebot's bit of a.
Declaration
public bool Bit_A()
Returns
| Type | Description |
|---|---|
| bool | Whether this amoebot's bit of |
Bit_B()
This amoebot's bit of b. Note that b will be shifted along the
chain during the procedure, one step per iteration.
Declaration
public bool Bit_B()
Returns
| Type | Description |
|---|---|
| bool | Whether this amoebot's bit of |
Bit_C()
This amoebot's bit of c, the result of multiplying a and b.
Declaration
public bool Bit_C()
Returns
| Type | Description |
|---|---|
| bool | Whether this amoebot's bit of |
GetStateBit(int)
Helper for reading a single bit from the state integer.
Declaration
private bool GetStateBit(int bit)
Parameters
| Type | Name | Description |
|---|---|---|
| int | bit | The position of the bit. |
Returns
| Type | Description |
|---|---|
| bool | The value of the state bit at position |
HaveOverflow()
Checks whether an overflow occurred during the multiplication. Should only be called once the procedure has finished.
Declaration
public bool HaveOverflow()
Returns
| Type | Description |
|---|---|
| bool |
|
Init(bool, bool, bool, Direction, Direction)
Initializes the subroutine. Must be called by each
amoebot on the chain that stores a and b.
Declaration
public void Init(bool a, bool b, bool msbA, Direction predDir, Direction succDir)
Parameters
| Type | Name | Description |
|---|---|---|
| bool | a | This amoebot's bit of |
| bool | b | This amoebot's bit of |
| bool | msbA | Whether this amoebot is the highest-value 1-bit of |
| Direction | predDir | The direction of the predecessor. Should be NONE only at the start of the chain. |
| Direction | succDir | The direction of the successor. Should be NONE only at the end of the chain. |
IsFinished()
Checks whether the procedure is finished. Should be called after ActivateReceive().
Declaration
public bool IsFinished()
Returns
| Type | Description |
|---|---|
| bool |
|
PredDir()
Helper for reading the predecessor direction from the state integer.
Declaration
private Direction PredDir()
Returns
| Type | Description |
|---|---|
| Direction | The direction of the chain predecessor. |
Round()
Helper for reading the round number from the state integer.
Declaration
private int Round()
Returns
| Type | Description |
|---|---|
| int | The current round number. |
SetRound(int)
Helper for setting the round counter.
Declaration
private void SetRound(int round)
Parameters
| Type | Name | Description |
|---|---|---|
| int | round | The new value of the round counter. |
SetStateBit(int, bool)
Helper for setting a single bit from the state integer.
Declaration
private void SetStateBit(int bit, bool value)
Parameters
| Type | Name | Description |
|---|---|---|
| int | bit | The position of the bit. |
| bool | value | The new value of the bit. |
SetupPinConfig(PinConfiguration)
Sets up the required circuits for the next step in the given pin configuration. This must be called after ActivateReceive() and before ActivateSend().
Declaration
public void SetupPinConfig(PinConfiguration pc)
Parameters
| Type | Name | Description |
|---|---|---|
| PinConfiguration | pc | The pin configuration to set up. Partition set IDs will always equal one of the IDs of the contained pins. |
SuccDir()
Helper for reading the successor direction from the state integer.
Declaration
private Direction SuccDir()
Returns
| Type | Description |
|---|---|
| Direction | The direction of the chain successor. |