Options: Use Forum View Use Proportional Font Show Text Part by Default Condense Mail Headers Message: [<< First] [< Prev] [Next >] [Last >>] Topic: [<< First] [< Prev] [Next >] [Last >>] Author: [<< First] [< Prev] [Next >] [Last >>]

```Why aren't you using modular types and simple masks?

type register is mod 2**8 ;
for register'size use 8 ;
x,y : register ;
...
x := y and 2#1010_1010# ;
y := x or 2#0101_0101# ;
x := x xor y ;
...
and you can do things like the following in an iteration:

subtype bit_number is natural range 0..7 ;
for I in bit_number'range loop
-- Turn off odd bits in x using a mask with
-- all bits on except the bit in question if I is odd
x := x and ( not Register( (I mod 2) * 2**I ) ) ;
end loop ;

or, perhaps more clearly
for I in bit_number'range loop
if I mod 2 then
x := x and (not register(2**I)) ;
end if ;
end loop ;

and so on.

If you insist on using "On" and "Off" then make a boolean type, use a
boolean *packed array* (not a record type) and get the same ability,
except the constants are a bit more awkward:
x := y and (On,Off,On,Off,On,Off,On,Off) ;
On the positive side, using an array does allow for more explicit
iteration across bits.

Regards,
Steve

> ----- Original Message -----
> Sent: Monday, April 15, 2002 1:11 AM
> Subject: Some questions on record attributes
>
>
> Hi,
> for the development for the port parallel interface, I've
> planned to map the unsigned_8 value to a record of bits of
> type (on,off). Do you know how to mask an integer or unsigned_8?
>
> As far as I haven't found an ellgant way I've done this:
>
> I've the next definitions:
>
> type flag is (on, off);
>
>  type Registro_Byte is
>       record
>          Bit0,
>          Bit1,
>          Bit2,
>          Bit3,
>          Bit4,
>          Bit5,
>          Bit6,
>          Bit7 : Flag;
>       end record;
>
> data : registro_byte;
> register : unsigned_8;
>
>
> (...) I load an 8-bit integer into the register:
>
> register:= 128; (this is done via DOSPORTS libraries)
>
> I want data to be a map of the register bit:
>
>     if Integer (Shift_Right (register , 0) mod 2 ) = 1 then
>          data.Bit0 := On;
>       else
>          data.Bit0 := Off;
>       end if;
>
>
>     if Integer (Shift_Right (register , 1) mod 2 ) = 1 then
>          data.Bit1 := On;
>       else
>          data.Bit1 := Off;
>       end if;
>
> and so on 'til BIT7.
>
> Do you know how to assign the values using a loop?
>
> I don't know how to do a loop that works like the next false one:
>
> for ix in 0..7 loop
>   if Integer (Shift_Right (register , ix ) mod 2 ) = 1 then
>          data.BIT(ix) := On; -- wrong line
>       else
>          data.Bit(ix) := Off; -- wrong line
>       end if;
> end loop;
>
>