module DDC.Driver.Stage.Tetra
( stageSourceTetraLoad
, stageTetraLoad
, stageTetraToSalt)
where
import DDC.Driver.Dump
import DDC.Driver.Config
import DDC.Interface.Source
import DDC.Build.Pipeline
import DDC.Base.Pretty
import qualified DDC.Build.Language.Tetra as BE
import qualified DDC.Build.Builder as B
import qualified DDC.Core.Tetra as CE
import qualified DDC.Core.Salt as CS
import qualified DDC.Core.Check as C
import qualified DDC.Core.Simplifier.Recipe as C
import qualified DDC.Core.Transform.Namify as C
import qualified DDC.Base.Parser as BP
stageSourceTetraLoad
:: Config -> Source
-> [PipeCore (C.AnTEC BP.SourcePos CE.Name) CE.Name]
-> PipeText CE.Name CE.Error
stageSourceTetraLoad config source pipesTetra
= PipeTextLoadSourceTetra
(dump config source "dump.tetra-load-tokens.txt")
(dump config source "dump.tetra-load-raw.dct")
(dump config source "dump.tetra-load-trace.txt")
( PipeCoreOutput pprDefaultMode
(dump config source "dump.tetra-load.dct")
: pipesTetra )
stageTetraLoad
:: Config -> Source
-> [PipeCore () CE.Name]
-> PipeText CE.Name CE.Error
stageTetraLoad config source pipesTetra
= PipeTextLoadCore BE.fragment
(if configInferTypes config then C.Synth else C.Recon)
(dump config source "dump.tetra-check.dct")
[ PipeCoreReannotate (const ())
( PipeCoreOutput pprDefaultMode
(dump config source "dump.tetra-load.dct")
: pipesTetra ) ]
stageTetraToSalt
:: Config -> Source
-> [PipeCore () CS.Name]
-> PipeCore () CE.Name
stageTetraToSalt config source pipesSalt
= pipe_norm
where
pipe_norm
= PipeCoreSimplify BE.fragment 0 normalize
[ PipeCoreCheck BE.fragment C.Recon SinkDiscard
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.tetra-normalized.dct")
, pipe_boxing ]]
normalize
= C.anormalize
(C.makeNamifier CE.freshT)
(C.makeNamifier CE.freshX)
pipe_boxing
= PipeCoreAsTetra
[ PipeTetraBoxing
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.tetra-boxing-raw.dct")
, PipeCoreSimplify BE.fragment 0 normalize
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.tetra-boxing-simp.dct")
, PipeCoreCheck BE.fragment C.Recon SinkDiscard
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.tetra-boxing.dct")
, pipe_toSalt]]]]
pipe_toSalt
= PipeCoreAsTetra
[ PipeTetraToSalt (B.buildSpec $ configBuilder config)
(configRuntime config)
( PipeCoreOutput pprDefaultMode
(dump config source "dump.salt.dcs")
: pipesSalt)]