// Copyright (c) 2012 DMTF.  All rights reserved.
   [Version ( "2.33.0" ), 
    ClassConstraint { 
       "inv:self.IsSpeedInMhz=true implies self.Speed = 0 and self.MaxMemorySpeed > 0", 
       "inv:self.IsSpeedInMhz=false implies self.MaxMemorySpeed=null" }, 
    UMLPackagePath ( "CIM::Physical::Component" ), 
    Description ( 
       "PhysicalMemory is a subclass of CIM_Chip, representing low "
       "level memory devices - SIMMS, DIMMs, raw memory chips, etc." )]
class CIM_PhysicalMemory : CIM_Chip {

      [Override ( "FormFactor" ), 
       MappingStrings { "MIF.DMTF|Memory Device|005.6" }]
   uint16 FormFactor;

      [Description ( 
          "The type of PhysicalMemory. Synchronous DRAM is also "
          "known as SDRAM Cache DRAM is also known as CDRAM CDRAM "
          "is also known as Cache DRAM SDRAM is also known as "
          "Synchronous DRAM BRAM is also known as Block RAM" ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
          "10", "11", "12", "13", "14", "15", "16", "17", "18", 
          "19", "20", "21", "22", "23", "24", "25", "26", "27", 
          "28", "29", "30", "31..32567", "32568..65535" }, 
       Values { "Unknown", "Other", "DRAM", "Synchronous DRAM", 
          "Cache DRAM", "EDO", "EDRAM", "VRAM", "SRAM", "RAM", 
          //10 
          "ROM", "Flash", "EEPROM", "FEPROM", 
          "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", 
          // 20              
          "DDR", "DDR-2", "BRAM", 
          "FB-DIMM", "DDR3", "FBD2", "DDR4", "LPDDR", "LPDDR2", 
          "LPDDR3", "LPDDR4", "DMTF Reserved", "Vendor Reserved" }, 
       MappingStrings { "MIF.DMTF|Memory Device|005.9" }]
   uint16 MemoryType;

      [Description ( 
          "Total width, in bits, of the PhysicalMemory, including "
          "check or error correction bits. If there are no error "
          "correction bits, the value in this property should match "
          "that specified for DataWidth." ), 
       Units ( "Bits" ), 
       MappingStrings { "MIF.DMTF|Memory Device|005.7" }]
   uint16 TotalWidth;

      [Description ( 
          "Data width of the PhysicalMemory, in bits. A data width "
          "of 0 and a TotalWidth of 8 would indicate that the "
          "Memory is solely used to provide error correction bits." ), 
       Units ( "Bits" ), 
       MappingStrings { "MIF.DMTF|Memory Device|005.8" }]
   uint16 DataWidth;

      [Description ( 
          "The speed of the PhysicalMemory, in nanoseconds." ), 
       Units ( "NanoSeconds" ), 
       MappingStrings { "MIF.DMTF|Memory Device|005.24" }, 
       ModelCorrespondence { "CIM_PhysicalMemory.MaxMemorySpeed", 
          "CIM_PhysicalMemory.IsSpeedInMHz" }]
   uint32 Speed;

      [Description ( 
          "The total capacity of this PhysicalMemory, in bytes." ), 
       Units ( "Bytes" ), 
       MappingStrings { "MIF.DMTF|Memory Device|005.5" }]
   uint64 Capacity;

      [Description ( 
          "A string identifying the physically labeled bank where "
          "the Memory is located - for example, \'Bank 0\' or \'Bank "
          "A\'." ), 
       MaxLen ( 64 ), 
       MappingStrings { "MIF.DMTF|Memory Device|005.4" }]
   string BankLabel;

      [Description ( 
          "Specifies the position of the PhysicalMemory in a \'row\'. "
          "For example, if it takes two 8-bit memory devices to "
          "form a 16- bit row, then a value of \'2\'means that this "
          "Memory is the second device. 0 is an invalid value for "
          "this property." ), 
       MappingStrings { 
          "MIF.DMTF|Memory Device Mapped Addresses|001.6" }]
   uint32 PositionInRow;

      [Description ( 
          "The position of this PhysicalMemory in an interleave. 0 "
          "indicates non-interleaved. 1 indicates the first "
          "position, 2 the second position and so on. For example, "
          "in a 2:1 interleave, a value of \'1\' would indicate "
          "that the Memory is in the \'even\' position." ), 
       MappingStrings { 
          "MIF.DMTF|Memory Device Mapped Addresses|001.7" }]
   uint32 InterleavePosition;

      [Description ( 
          "The configured clock speed (in MHz) of PhysicalMemory." ), 
       Units ( "MegaHertz" )]
   uint32 ConfiguredMemoryClockSpeed;

      [Description ( 
          "The IsSpeedInMHz property is used to indicate if the "
          "Speed property or the MaxMemorySpeed contains the value "
          "of the memory speed. A value of TRUE shall indicate that "
          "the speed is represented by the MaxMemorySpeed property. "
          "A value of FALSE shall indicate that the speed is "
          "represented by the Speed property." ), 
       ModelCorrespondence { "CIM_PhysicalMemory.Speed", 
          "CIM_PhysicalMemory.MaxMemorySpeed" }]
   boolean IsSpeedInMhz = false;

      [Description ( "The maximum speed (in MHz) of PhysicalMemory." ), 
       Units ( "MegaHertz" ), 
       ModelCorrespondence { "CIM_PhysicalMemory.Speed", 
          "CIM_PhysicalMemory.IsSpeedInMHz" }]
   uint32 MaxMemorySpeed;


};
