{-# LANGUAGE FlexibleContexts, FlexibleInstances, GADTs,
  NoImplicitPrelude, Rank2Types, TypeFamilies, UndecidableInstances
  #-}

module Ethereum.Analyzer.EVM.Util
  ( disasmToDotText
  , disasmToDotText2
  ) where

import Protolude hiding (show)

import Ethereum.Analyzer.EVM.CfgAugWithTopNPass
import Ethereum.Analyzer.EVM.CfgAugmentPass
import Ethereum.Analyzer.EVM.Disasm
import Ethereum.Analyzer.EVM.IR
import Ethereum.Analyzer.Util

disasmToDotText :: HasEvmBytecode a => a -> Text
disasmToDotText a =
  let disasmd = disasm a
      result =
        unWordLabelMapM $ do
          contract <- evmOps2HplContract disasmd
          toDotText <$> (ctorOf <$> doCfgAugmentPass contract)
  in result

disasmToDotText2 :: HasEvmBytecode a => a -> (Text, Text)
disasmToDotText2 a =
  let result =
        unWordLabelMapM $ do
          contract' <- doCfgAugWithTopNPass a
          return
            (toDotText (ctorOf contract'), toDotText (dispatcherOf contract'))
  in result