-- |
-- Module      : Verismith.Tool.Identity
-- Description : The identity simulator and synthesiser.
-- Copyright   : (c) 2019, Yann Herklotz Grave
-- License     : GPL-3
-- Maintainer  : yann [at] yannherklotz [dot] com
-- Stability   : experimental
-- Portability : POSIX
--
-- The identity simulator and synthesiser.
module Verismith.Tool.Identity
  ( Identity (..),
    defaultIdentity,
  )
where

import Control.DeepSeq (NFData, rnf, rwhnf)
import Data.Text (Text, unpack)
import Shelly (FilePath)
import Shelly.Lifted (writefile)
import Verismith.Tool.Internal
import Verismith.Verilog.AST
import Verismith.Verilog.CodeGen
import Prelude hiding (FilePath)

data Identity = Identity
  { Identity -> Text
identityDesc :: !Text,
    Identity -> FilePath
identityOutput :: !FilePath
  }
  deriving (Identity -> Identity -> Bool
(Identity -> Identity -> Bool)
-> (Identity -> Identity -> Bool) -> Eq Identity
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Identity -> Identity -> Bool
== :: Identity -> Identity -> Bool
$c/= :: Identity -> Identity -> Bool
/= :: Identity -> Identity -> Bool
Eq)

instance Tool Identity where
  toText :: Identity -> Text
toText (Identity Text
d FilePath
_) = Text
d

instance Show Identity where
  show :: Identity -> FilePath
show Identity
t = Text -> FilePath
unpack (Text -> FilePath) -> Text -> FilePath
forall a b. (a -> b) -> a -> b
$ Identity -> Text
forall a. Tool a => a -> Text
toText Identity
t

instance Synthesiser Identity where
  runSynth :: forall ann. Show ann => Identity -> SourceInfo ann -> ResultSh ()
runSynth = Identity -> SourceInfo ann -> ResultSh ()
forall ann. Show ann => Identity -> SourceInfo ann -> ResultSh ()
runSynthIdentity
  synthOutput :: Identity -> FilePath
synthOutput = Identity -> FilePath
identityOutput
  setSynthOutput :: Identity -> FilePath -> Identity
setSynthOutput (Identity Text
a FilePath
_) = Text -> FilePath -> Identity
Identity Text
a

instance NFData Identity where
  rnf :: Identity -> ()
rnf = Identity -> ()
forall a. a -> ()
rwhnf

runSynthIdentity :: (Show ann) => Identity -> (SourceInfo ann) -> ResultSh ()
runSynthIdentity :: forall ann. Show ann => Identity -> SourceInfo ann -> ResultSh ()
runSynthIdentity (Identity Text
_ FilePath
out) = FilePath -> Text -> ResultSh ()
forall (m :: * -> *). MonadSh m => FilePath -> Text -> m ()
writefile FilePath
out (Text -> ResultSh ())
-> (SourceInfo ann -> Text) -> SourceInfo ann -> ResultSh ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceInfo ann -> Text
forall a. Source a => a -> Text
genSource

defaultIdentity :: Identity
defaultIdentity :: Identity
defaultIdentity = Text -> FilePath -> Identity
Identity Text
"identity" FilePath
"syn_identity.v"