module Coppelius.SM86Capability import Accelerator.SM86.Capability import Model.Config import Model.Parameter import Model.Word32 import Model.Word64 import Std.Physical import Std.Word -- The compatibility profile is the intersection of what the existing -- Coppelius artifact uses on the qualified RTX 3070 and what an arbitrary -- device must demonstrate. There is intentionally no product-name field. def coppeliusSM86CompatProfileIdentity : Bytes = b"coppelius-sm86-compat-v1" def coppeliusSM86CompatMinimumVideoMemory : ByteCount = (stdByteCount 0x0000_0000_8000_0000) def coppeliusSM86CompatMappedAddressEnd : DeviceAddress = (stdDeviceAddress 0x0000_0009_8000_0000) -- the shared memory a block may use on every compatible card: compute -- capability 8.6's 48 KiB of static shared memory per block (the RTX 3090 -- profile's supply; the GB10 gives more). Coppelius's one realization -- serves both, so its tiles fit this. def coppeliusSM86CompatSharedBytesPerBlock : Nat = sm86StaticSharedBytesPerBlock def coppeliusSM86CompatMaximumGridX : GridDimension = (stdGridDimension 1_024) def coppeliusSM86CompatCapabilityRequirements : (family SM86CapabilityRequirements) = (record SM86CapabilityRequirements (sm86RequirementComputeMajor = 8) (sm86RequirementComputeMinor = 6) (sm86RequirementAvailableVideoMemoryBytes = (stdByteCountValue coppeliusSM86CompatMinimumVideoMemory)) (sm86RequirementMappedAddressEnd = (stdDeviceAddressValue coppeliusSM86CompatMappedAddressEnd)) (sm86RequirementMaximumGridX = (stdU32ToNatural (stdGridDimensionValue coppeliusSM86CompatMaximumGridX))) (sm86RequirementUVM = 1) (sm86RequirementResourceManager = 1) (sm86RequirementQMD = 1) (sm86RequirementPushbuffer = 1) (sm86RequirementGPFIFO = 1) (sm86RequirementDeviceTimestamps = 1) (sm86RequirementNoHostFallback = 1)) def coppeliusSM86CompatAdmit = (lambda unrestricted observed : (family SM86DeviceCapabilities) . (sm86CapabilityAdmit coppeliusSM86CompatCapabilityRequirements observed))