view gcc/testsuite/gnat.dg/specs/vfa2.ads @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
line wrap: on
line source

-- { dg-do compile }
-- { dg-options "-O" }

package VFA2 is

   type Bit is mod 2**1
     with Size => 1;
   type UInt2 is mod 2**2
     with Size => 2;
   type UInt22 is mod 2**22
     with Size => 22;

   type MODE_ENUM is
     (
      Function_0_Default,
      Function_1,
      Function_2,
      Function_3,
      Function_4,
      Function_5,
      Function_6,
      Function_7)
     with Size => 3;

   type EPD_ENUM is
     (
      Disable_Pull_Down,
      Enable_Pull_Down)
     with Size => 1;

   type EPUN_ENUM is
     (
      Enable_Pull_Up,
      Disable_Pull_Up)
     with Size => 1;

   type EHS_ENUM is
     (
      Slow_Low_Noise_With,
      Fast_Medium_Noise_W)
     with Size => 1;

   type EZI_ENUM is
     (
      Disable_Input_Buffer,
      Enable_Input_Buffer)
     with Size => 1;

   type ZIF_ENUM is
     (
      Enable_Input_Glitch,
      Disable_Input_Glitch)
     with Size => 1;

   type EHD_ENUM is
     (
      Normal_Drive_4_Ma_D,
      Medium_Drive_8_Ma_D,
      High_Drive_14_Ma_Dr,
      Ultra_High_Drive_20)
     with Size => 2;

   type Pin_Type is (Normal_Drive, High_Drive, High_Speed);

   type SFS_Register(Pin : Pin_Type := Normal_Drive) is record
      MODE     : MODE_ENUM;
      EPD      : EPD_ENUM;
      EPUN     : EPUN_ENUM;
      EZI      : EZI_ENUM;
      ZIF      : ZIF_ENUM;
      RESERVED : UInt22;

      case Pin is
         when Normal_Drive =>

            ND_EHS_RESERVED : Bit;
            ND_EHD_RESERVED : UInt2;

         when High_Drive =>

            EHD : EHD_ENUM;
            HD_EHS_RESERVED : Bit;

         when High_Speed =>
            EHS    : EHS_ENUM;
            HS_EHD_RESERVED : UInt2;

      end case;
   end record
     with Unchecked_Union, Size => 32, Volatile_Full_Access;

   for SFS_Register use record
      MODE            at 0 range 0 .. 2;
      EPD             at 0 range 3 .. 3;
      EPUN            at 0 range 4 .. 4;
      ND_EHS_RESERVED at 0 range 5 .. 5;
      HD_EHS_RESERVED at 0 range 5 .. 5;
      EHS             at 0 range 5 .. 5;
      EZI             at 0 range 6 .. 6;
      ZIF             at 0 range 7 .. 7;
      ND_EHD_RESERVED at 0 range 8 .. 9;
      EHD             at 0 range 8 .. 9;
      HS_EHD_RESERVED at 0 range 8 .. 9;
      RESERVED        at 0 range 10 .. 31;
   end record;

   type Normal_Drive_Pins is array (Integer range <>)
     of SFS_Register(Normal_Drive) with Volatile;

end VFA2;