module Data.Stdf.Types where
import Data.Word
import Data.Int
import Foreign.C.Types
import Data.Text.Lazy
import GHC.Generics hiding (U1, C1)
import Data.Aeson
import Data.Aeson.Types
import Data.Time.Clock
type U1 = Word8
type U2 = Word16
type U4 = Word32
type I1 = Int8
type I2 = Int16
type I4 = Int32
type R4 = Float
type R8 = Double
type C1 = Char
jsonOptions = defaultOptions {
allNullaryToStringTag = False
, omitNothingFields = True
, sumEncoding = ObjectWithSingleField
}
flagOptions = defaultOptions
instance ToJSON Milliseconds where
toJSON = genericToJSON jsonOptions
instance ToJSON Minutes where
toJSON = genericToJSON jsonOptions
instance ToJSON Rec where
toJSON = genericToJSON jsonOptions
instance ToJSON PartFlag where
toJSON = genericToJSON jsonOptions
instance ToJSON GdrField where
toJSON = genericToJSON jsonOptions
instance ToJSON TestType where
toJSON = genericToJSON jsonOptions
instance ToJSON WaferUnits where
toJSON = genericToJSON jsonOptions
instance ToJSON Direction where
toJSON = genericToJSON jsonOptions
instance ToJSON OptionalInfo where
toJSON = genericToJSON jsonOptions
instance ToJSON GroupMode where
toJSON = genericToJSON jsonOptions
instance ToJSON Radix where
toJSON = genericToJSON jsonOptions
instance ToJSON TestFlag where
toJSON = genericToJSON flagOptions
instance ToJSON PassFailBin where
toJSON = genericToJSON jsonOptions
instance ToJSON ParametricFlag where
toJSON = genericToJSON flagOptions
data BinRec = BinRec
{ header :: Header
, rec :: Rec } deriving (Generic, Show)
data Header = Header
{ len :: !Word16
, typ :: !Word8
, sub :: !Word8
} deriving (Generic, Show)
type Stdf = [Rec]
data Milliseconds = Milliseconds { ms :: !U4 }
deriving (Generic, Show)
data Minutes = Minutes { minutes :: !U2 }
deriving (Generic, Show)
data Rec= Raw { raw :: Text }
| Far { cpuType :: !U1
, stdfVersion :: !U1 }
| Atr { modificationTime :: Maybe UTCTime
, commandLine :: Maybe Text }
| Mir { setupTime :: Maybe UTCTime
, startTime :: Maybe UTCTime
, station :: !U1
, modeCode :: Maybe C1
, retestCode :: Maybe C1
, protectionCode :: Maybe C1
, burninTime :: Maybe Minutes
, commandCode :: Maybe C1
, lotId :: Text
, partType :: Text
, nodeName :: Text
, testerType :: Text
, jobName :: Text
, jobRevision :: Maybe Text
, subLotId :: Maybe Text
, operatorName :: Maybe Text
, execType :: Maybe Text
, execVersion :: Maybe Text
, testCode :: Maybe Text
, testTemperature :: Maybe Text
, userText :: Maybe Text
, auxFile :: Maybe Text
, packageType :: Maybe Text
, familyId :: Maybe Text
, dateCode :: Maybe Text
, facilityId :: Maybe Text
, floorId :: Maybe Text
, processId :: Maybe Text
, operationFreq :: Maybe Text
, specName :: Maybe Text
, specVersion :: Maybe Text
, flowId :: Maybe Text
, setupId :: Maybe Text
, designRev :: Maybe Text
, engineeringLotId :: Maybe Text
, romCodeId :: Maybe Text
, testerSerialNum :: Maybe Text
, supervisorName :: Maybe Text }
| Mrr { finishTime :: Maybe UTCTime
, lotDisposition :: Maybe C1
, userDescription :: Maybe Text
, execDescription :: Maybe Text }
| Pcr { headId :: !U1
, siteId :: !U1
, partCount :: !U4
, retestCount :: Maybe U4
, abortCount :: Maybe U4
, goodCount :: Maybe U4
, functionalCount :: Maybe U4 }
| Hbr { headId :: !U1
, siteId :: !U1
, bin :: !U2
, binCount :: !U4
, passFailBin :: PassFailBin
, name :: Maybe Text }
| Sbr { headId :: !U1
, siteId :: !U1
, bin :: !U2
, binCount :: !U4
, passFail :: PassFailBin
, name :: Maybe Text }
| Pmr { index :: !U2
, channelType :: Maybe U2
, channelName :: Maybe Text
, physicalName :: Maybe Text
, logicalName :: Maybe Text
, headId :: !U1
, siteId :: !U1 }
| Pgr { index :: !U2
, name :: Maybe Text
, pinIndecies :: [U2] }
| Plr {
indecies :: [U2]
, groupModes :: [GroupMode]
, groupRadixes :: [Radix]
, programStateCharsRight :: [Maybe Text]
, returnStateCharsRight :: [Maybe Text]
, programStateCharsLeft :: [Maybe Text]
, returnStateCharsLeft :: [Maybe Text] }
| Rdr { retestBins :: [U2] }
| Sdr { headId :: !U1
, siteGroup :: !U1
, sites :: [U1]
, handlerType :: Maybe Text
, handlerId :: Maybe Text
, probeCardType :: Maybe Text
, probeCardId :: Maybe Text
, loadBoardType :: Maybe Text
, loadBoardId :: Maybe Text
, dibType :: Maybe Text
, dibId :: Maybe Text
, cableType :: Maybe Text
, cableId :: Maybe Text
, contactorType :: Maybe Text
, contactorId :: Maybe Text
, laserType :: Maybe Text
, laserId :: Maybe Text
, extraType :: Maybe Text
, extraId :: Maybe Text }
| Wir { headId :: !U1
, siteGroup :: !U1
, startTime :: Maybe UTCTime
, waferId :: Maybe Text }
| Wrr { headId :: !U1
, siteGroup :: !U1
, finishTime :: Maybe UTCTime
, partCount :: !U4
, retestCount :: Maybe U4
, abortCount :: Maybe U4
, goodCount :: Maybe U4
, functionalCount :: Maybe U4
, waferId :: Maybe Text
, fabWaferId :: Maybe Text
, waferFrameId :: Maybe Text
, waferMaskId :: Maybe Text
, userDescription :: Maybe Text
, execDescription :: Maybe Text }
| Wcr { waferSize :: Maybe R4
, dieHeight :: Maybe R4
, dieWidth :: Maybe R4
, waferUnits :: Maybe WaferUnits
, waferFlat :: Maybe Direction
, centerX :: Maybe I2
, centerY :: Maybe I2
, positiveXdirection :: Maybe Direction
, positiveYdirection :: Maybe Direction }
| Pir { headId :: !U1
, siteId :: !U1 }
| Prr { headId :: !U1
, siteId :: !U1
, partFlag :: !PartFlag
, numTestsExecuted :: !U2
, hardBin :: !U2
, softBin :: Maybe U2
, xCoord :: Maybe I2
, yCoord :: Maybe I2
, testTime :: Maybe Milliseconds
, partID :: Maybe Text
, partTxt :: Maybe Text
, partFix :: Maybe Text }
| Tsr { headId :: !U1
, siteId :: !U1
, testType :: Maybe TestType
, testId :: !U4
, execCount :: Maybe U4
, failCount :: Maybe U4
, alarmCount :: Maybe U4
, testName :: Maybe Text
, sequencerName :: Maybe Text
, testLabel :: Maybe Text
, testTimeAverage :: Maybe R4
, valueMin :: Maybe R4
, valueMax :: Maybe R4
, valueSum :: Maybe R4
, valueSumOfSquares :: Maybe R4 }
| Ptr { testId :: !U4
, headId :: !U1
, siteId :: !U1
, testFlags :: [TestFlag]
, parametricFlags :: [ParametricFlag]
, result :: Maybe R4
, testText :: Maybe Text
, info :: [OptionalInfo] }
| Mpr { testId :: !U4
, headId :: !U1
, siteId :: !U1
, testFlags :: [TestFlag]
, parametricFlags :: [ParametricFlag]
, states :: [U1]
, results :: [R4]
, testText :: Maybe Text
, info :: [OptionalInfo] }
| Ftr { testId :: !U4
, headId :: !U1
, siteId :: !U1
, testFlags :: [TestFlag]
, info :: [OptionalInfo]
}
| Bps { sequencerName :: Maybe Text }
| Eps
| Gdr [GdrField]
| Dtr { textDat :: Text }
deriving (Generic, Show)
data GroupMode = UnknownGroupMode
| Normal
| SameCycleIO
| SameCycleMidband
| SameCycleValid
| SameCycleWindowSustain
| DualDrive
| DualDriveMidband
| DualDriveValid
| DualDriveWindowSustain
| OtherGroupMode U2
deriving (Generic, Show)
data Radix = DefaultRadix
| Binary
| Octal
| Decimal
| Hexadecimal
| Symbolic
| OtherRadix U1
deriving (Generic, Show)
data TestFlag = Alarm
| Invalid
| Unreliable
| Timeout
| NotExecuted
| Aborted
| InValid
| Pass
| Fail
deriving (Generic, Show, Eq, Enum)
data PassFailBin = PassBin | FailBin | UnknownBin | OtherBin Char
deriving (Generic, Show)
data ParametricFlag = ScaleError
| DriftError
| Oscillation
| FailHighLimit
| FailLowLimit
| PassAlternateLimits
| PassOnEqLowLimit
| PassOnEqHighLimit
deriving (Generic, Show, Eq, Enum)
data OptionalInfo = Units Text
| LowSpecLimit Float
| HighSpecLimit Float
| LowSpecLimitStr Text
| HighSpecLimitStr Text
| AlarmId Text
| LowLimit Float
| HighLimit Float
| LowLimitStr Text
| HighLimitStr Text
| ResultStr Text
| StartingInput Float
| StartingInputUnits Text
| IncrementInput Float
| ReturnPinIndecies [U2]
| CycleCount U4
| RepeatCount U4
| RelativeVectorAddr U4
| NumFailingPins U4
| XLogicalFailureAddr I4
| YLogicalFailureAddr I4
| OffsetFromVector I2
| PinIndecies [U2]
| ReturnedStates [U1]
| PgmStateIndecies [U2]
| PgmStates [U1]
| FailPin [U1]
| VectorName Text
| TimeSet Text
| OpCode Text
| Label Text
| ProgramText Text
| ResultText Text
| PatternGen U1
| EnabledPins [U1]
deriving (Generic, Show)
data TestType = Parametric
| Functional
| MultiResultParametric
| UnknownTestType
| OtherTestType C1
deriving (Generic, Show)
data WaferUnits = Inches
| Centimeters
| Millimeters
| Mils
| OtherUnits U1
deriving (Generic, Show)
data Direction = Up
| Down
| Left
| Right
| OtherDirection C1
deriving (Generic, Show)
data GdrField = GPad
| GU1 !U1
| GU2 !U2
| GU4 !U4
| GI1 !I1
| GI2 !I2
| GI4 !I4
| GFloat Float
| GDouble Double
| GStr Text
| GBytes [U1]
| GData [U1]
| GNibble !U1
deriving (Generic, Show)
data PartFlag = PartFlag { supersedesPartId :: Bool
, supersedesXY :: Bool
, abnormalEnd :: Bool
, failed :: Bool
, noPassFailInfo :: Bool }
deriving (Generic, Show)