<> <> <> <> DIRECTORY Basics; BitOps: CEDAR DEFINITIONS = BEGIN <> <> <> <> <> <> BitWord: TYPE = CARDINAL; BitDWord: TYPE = LONG CARDINAL; BitQWord: TYPE = ARRAY [0 .. 4) OF CARDINAL; BitMWord: TYPE = LONG DESCRIPTOR FOR ARRAY CARDINAL OF BitWord; <> <> Long: TYPE = LONG CARDINAL; <> bitsPerWord: NAT = Basics.bitsPerWord; bitsPerDWord: NAT = 2*Basics.bitsPerWord; bitsPerQWord: NAT = 4*Basics.bitsPerWord; LastWBit: NAT = bitsPerWord - 1; LastDBit: NAT = bitsPerDWord - 1; LastQBit: NAT = bitsPerQWord - 1; BitWordZero: BitWord = 0; BitWordOnes: BitWord = 65535; BitDWordZero: BitDWord = 0; BitDWordOnes: BitDWord = 4294967295; BitQWordZero: BitQWord = [0, 0, 0, 0]; BitQWordOnes: BitQWord = [BitWordOnes, BitWordOnes, BitWordOnes, BitWordOnes]; <<>> <> <<>> ODD: PROC [i: INT] RETURNS [BOOL]; EVEN: PROC [i: INT] RETURNS [BOOL]; <> <<>> Log2: PROC [n: INT] RETURNS [INT]; -- Floor of Log2 NBits: PROC [n: INT] RETURNS [INT]; TwoToThe: PROC [x: INT] RETURNS [INT]; TwoToTheLog2: PROC [n: INT] RETURNS [INT]; <> <<>> <> <> <> <> <> <> <> <> <<>> <> ExtractBoolFWord, EBFW: PROC [container: BitWord, bitPosition: NAT, containerWidth: NAT _ bitsPerWord] RETURNS [result: BOOL]; InsertBoolInWord, IBIW: PROC [source: BOOL, container: BitWord, bitPosition: NAT, containerWidth: NAT _ bitsPerWord] RETURNS [newContainer: BitWord]; ExtractBoolFDouble, EBFD: PROC [container: BitDWord, bitPosition: NAT, containerWidth: NAT _ bitsPerDWord] RETURNS [result: BOOL]; InsertBoolInDouble, IBID: PROC [source: BOOL, container: BitDWord, bitPosition: NAT, containerWidth: NAT _ bitsPerDWord] RETURNS [newContainer: BitDWord]; ExtractBoolFQuad, EBFQ: PROC [container: BitQWord, bitPosition: NAT, containerWidth: NAT _ bitsPerQWord] RETURNS [result: BOOL]; InsertBoolInQuad, IBIQ: PROC [source: BOOL, container: BitQWord, bitPosition: NAT, containerWidth: NAT _ bitsPerQWord] RETURNS [newContainer: BitQWord]; ExtractBoolFMultiple, EBFM: PROC [container: BitMWord, bitPosition: NAT, containerWidth: NAT] RETURNS [result: BOOL]; InsertBoolInMultiple, IBIM: PROC [source: BOOL, container: BitMWord, bitPosition: NAT, containerWidth: NAT]; <> ExtractCardinalFWord, ECFW: PROC [container: BitWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerWord] RETURNS [result: CARDINAL]; InsertCardinalInWord, ICIW: PROC [source: CARDINAL, container: BitWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerWord] RETURNS [newContainer: BitWord]; ExtractCardinalFDouble, ECFD: PROC [container: BitDWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerDWord] RETURNS [result: CARDINAL]; InsertCardinalInDouble, ICID: PROC [source: CARDINAL, container: BitDWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerDWord] RETURNS [newContainer: BitDWord]; ExtractCardinalFQuad, ECFQ: PROC [container: BitQWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerQWord] RETURNS [result: CARDINAL]; InsertCardinalInQuad, ICIQ: PROC [source: CARDINAL, container: BitQWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerQWord] RETURNS [newContainer: BitQWord]; ExtractCardinalFMultiple, ECFM: PROC [container: BitMWord, fieldPosition, fieldWidth, containerWidth: NAT] RETURNS [result: CARDINAL]; InsertCardinalInMultiple, ICIM: PROC [source: CARDINAL, container: BitMWord, fieldPosition, fieldWidth, containerWidth: NAT]; <> ExtractLongFWord, ELFW: PROC [container: BitWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerWord] RETURNS [result: Long]; InsertLongInWord, ILIW: PROC [source: Long, container: BitWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerWord] RETURNS [newContainer: BitWord]; ExtractLongFDouble, ELFD: PROC [container: BitDWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerDWord] RETURNS [result: Long]; InsertLongInDouble, ILID: PROC [source: Long, container: BitDWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerDWord] RETURNS [newContainer: BitDWord]; ExtractLongFQuad, ELFQ: PROC [container: BitQWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerQWord] RETURNS [result: Long]; InsertLongInQuad, ILIQ: PROC [source: Long, container: BitQWord, fieldPosition, fieldWidth: NAT, containerWidth: NAT _ bitsPerQWord] RETURNS [newContainer: BitQWord]; ExtractLongFMultiple, ELFM: PROC [container: BitMWord, fieldPosition, fieldWidth, containerWidth: NAT] RETURNS [result: Long]; InsertLongInMultiple, ILIM: PROC [source: Long, container: BitMWord, fieldPosition, fieldWidth, containerWidth: NAT]; <> WordAND, WAND: PROC [op1, op2: BitWord] RETURNS [result: BitWord]; WordOR, WOR: PROC [op1, op2: BitWord] RETURNS [result: BitWord]; WordXOR, WXOR: PROC [op1, op2: BitWord] RETURNS [result: BitWord]; WordNOT, WNOT: PROC [op: BitWord, containerWidth: NAT _ bitsPerWord] RETURNS [result: BitWord]; WordShift, WShift: PROC [op: BitWord, shift: INTEGER, containerWidth: NAT _ bitsPerWord] RETURNS [result: BitWord]; DoubleAND, DAND: PROC [op1, op2: BitDWord] RETURNS [result: BitDWord]; DoubleOR, DOR: PROC [op1, op2: BitDWord] RETURNS [result: BitDWord]; DoubleXOR, DXOR: PROC [op1, op2: BitDWord] RETURNS [result: BitDWord]; DoubleNOT, DNOT: PROC [op: BitDWord, containerWidth: NAT _ bitsPerDWord] RETURNS [result: BitDWord]; DoubleShift, DShift: PROC [op: BitDWord, shift: INTEGER, containerWidth: NAT _ bitsPerDWord] RETURNS [result: BitDWord]; QuadAND, QAND: PROC [op1, op2: BitQWord] RETURNS [result: BitQWord]; QuadOR, QOR: PROC [op1, op2: BitQWord] RETURNS [result: BitQWord]; QuadXOR, QXOR: PROC [op1, op2: BitQWord] RETURNS [result: BitQWord]; QuadNOT, QNOT: PROC [op: BitQWord, containerWidth: NAT _ bitsPerQWord] RETURNS [result: BitQWord]; QuadShift, QShift: PROC [op: BitQWord, shift: INTEGER, containerWidth: NAT _ bitsPerQWord] RETURNS [result: BitQWord]; MulitipleAND, MAND: PROC [op1: BitMWord, op2: BitMWord, result: BitMWord]; MulitipleOR, MOR: PROC [op1: BitMWord, op2: BitMWord, result: BitMWord]; MulitipleXOR, MXOR: PROC [op1: BitMWord, op2: BitMWord, result: BitMWord]; MulitipleNOT, MNOT: PROC [op: BitMWord, containerWidth: NAT, result: BitMWord]; MulitipleShift, MShift: PROC [op: BitMWord, shift: INTEGER, containerWidth: NAT, result: BitMWord]; <> wordMasks: ARRAY [0 .. bitsPerWord] OF BitWord; doubleMasks: ARRAY [0 .. bitsPerDWord] OF BitDWord; quadMasks: ARRAY [0 .. bitsPerQWord] OF BitQWord; <> END.