Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

replace toml to yaml #276

Open
wants to merge 22 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions app/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import NITTA.Synthesis (TargetSynthesis (..), mlScoreKeyPrefix, noSynthesis, sta
import NITTA.Synthesis.MlBackend.ServerInstance
import NITTA.UIBackend
import NITTA.UIBackend.Types (BackendCtx, mlBackendGetter, nodeScores, outputPath, receivedValues, root)
import NITTA.Utils
import Paths_nitta
import System.Console.CmdArgs hiding (def)
import System.Exit
Expand Down Expand Up @@ -199,8 +198,6 @@ nittaArgs =
getNittaArgs :: IO Nitta
getNittaArgs = cmdArgs nittaArgs

fromConf toml s = getFromTomlSection s =<< toml

main = do
( Nitta
filename
Expand Down Expand Up @@ -229,10 +226,9 @@ main = do
-- force line buffering (always, not just when stdout is connected to a tty),
-- it's critical for successful parsing of NITTA's stdout in python scripts
hSetBuffering stdout LineBuffering

toml <- case uarch of
conf <- case uarch of
Nothing -> return Nothing
Just path -> Just . getToml <$> T.readFile path
Just path -> Just <$> parseConfig path
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something like parseConfig <$> path should work?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parseConfig is a FilePath -> IO MicroarchitectureConf type
path is a FilePath type
<$> is a (a -> b) -> f a -> f b type

The result must be type of IO Maybe MicroarchitectureConf, so Just <$> parseConfig pathdoesn't seem to be able to be simplified.


let exactFrontendType = identifyFrontendType filename frontend_language

Expand All @@ -241,8 +237,8 @@ main = do
let frontendResult@FrontendResult{frDataFlow, frTrace, frPrettyLog} =
translate exactFrontendType src
received = [("u#0", map (\i -> read $ show $ sin ((2 :: Double) * 3.14 * 50 * 0.001 * i)) [0 .. toEnum n])]
ioSync = fromJust $ io_sync <|> fromConf toml "ioSync" <|> Just Sync
confMa = toml >>= Just . mkMicroarchitecture ioSync
ioSync = fromJust $ io_sync <|> ioSync' <$> conf <|> Just Sync
confMa = mkMicroarchitecture <$> conf
ma :: BusNetwork T.Text T.Text (Attr (FX m b)) Int
ma
| auto_uarch && isJust confMa =
Expand Down Expand Up @@ -302,7 +298,7 @@ main = do
exitSuccess
)
$ parseFX . fromJust
$ type_ <|> fromConf toml "type" <|> Just "fx32.32"
$ type_ <|> T.unpack . type' <$> conf <|> Just "fx32.32"
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use fromString.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fromString is a type of String -> ByteString, but I need a function type of Text -> String


parseFX input =
let typePattern = mkRegex "fx([0-9]+).([0-9]+)"
Expand Down
46 changes: 0 additions & 46 deletions examples/microarch.toml

This file was deleted.

32 changes: 32 additions & 0 deletions examples/microarch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
type: fx32.32
ioSync: Sync
networks:
- name: net1
pus:
- type: SPI
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can use name as key here? Do you see any disadvantages of this approuch?

The same for the network

name: spi
mosi: mosi
miso: miso
sclk: sclk
cs: cs
isSlave: true
bufferSize: 6
bounceFilter: 0
protos:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let move it to the top level as puLibrary.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is is about all PUs, which nitta can allocate automatically. Current -- in network. Should be -- on the top level & network.

- type: Fram
name: fram{x} # If you want a PU can be allocated only once, remove {x} from the PU name.
size: 32
- type: Shift
name: shift{x}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you know what this special syntax means?

sRight: true
- type: Multiplier
name: mul{x}
mock: true
- type: Accum
name: accum{x}
isInt: true
- type: Divider
name: div{x}
mock: true
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will be nice to make possible to set this attr globally.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mock -- attr used for logic simulation via icarus verilog for complex PU, like divider.

Usually, we don't need to specify it for PUs independently, so it will be nice to move it on the top level.

pipeline: 4

8 changes: 4 additions & 4 deletions nitta.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ library
, hashable
, heap
, hslogger
, htoml
, http-api-data
, http-conduit
, hxt
Expand Down Expand Up @@ -178,6 +177,7 @@ library
, wai-app-static
, wai-cors
, warp
, yaml
default-language: Haskell2010

executable nitta
Expand Down Expand Up @@ -211,7 +211,6 @@ executable nitta
, ginger
, heap
, hslogger
, htoml
, intervals
, mtl
, nitta
Expand All @@ -223,6 +222,7 @@ executable nitta
, tostring
, unordered-containers
, wai-app-static
, yaml
default-language: Haskell2010

executable nitta-api-gen
Expand Down Expand Up @@ -259,7 +259,6 @@ executable nitta-api-gen
, ginger
, heap
, hslogger
, htoml
, intervals
, mtl
, nitta
Expand All @@ -271,6 +270,7 @@ executable nitta-api-gen
, tostring
, unordered-containers
, wai-app-static
, yaml
default-language: Haskell2010

test-suite nitta-test
Expand Down Expand Up @@ -337,7 +337,6 @@ test-suite nitta-test
, genvalidity-property
, ginger
, heap
, htoml
, hxt
, intervals
, language-lua
Expand All @@ -359,4 +358,5 @@ test-suite nitta-test
, tostring
, unordered-containers
, wai-app-static
, yaml
default-language: Haskell2010
2 changes: 1 addition & 1 deletion package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ dependencies:
- data-default
- filepath
- ginger
- htoml
- yaml
- intervals
- mtl
- prettyprinter
Expand Down
39 changes: 28 additions & 11 deletions src/NITTA/Model/Microarchitecture/Config.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,27 @@
{-# LANGUAGE PartialTypeSignatures #-}

module NITTA.Model.Microarchitecture.Config (
MicroarchitectureConf (type', ioSync'),
parseConfig,
mkMicroarchitecture,
) where

import Data.Aeson (
FromJSON (parseJSON),
Options (sumEncoding),
SumEncoding (TaggedObject, contentsFieldName, tagFieldName),
ToJSON (toJSON),
defaultOptions,
genericParseJSON,
genericToJSON,
)
import Data.Default (Default (def))
import Data.HashMap.Internal.Strict (HashMap)
import Data.Text qualified as T
import Data.Yaml (
FromJSON (parseJSON),
ToJSON (toJSON),
Value (Object),
decodeFileThrow,
(.:),
)
import GHC.Generics (Generic)
import NITTA.Intermediate.Value (Val)
import NITTA.Intermediate.Variable (Var)
Expand All @@ -30,7 +36,6 @@ import NITTA.Model.Networks.Bus (
)
import NITTA.Model.Networks.Types (IOSynchronization)
import NITTA.Model.ProcessorUnits qualified as PU
import NITTA.Utils (getFromToml)

data PUConf
= Accum
Expand Down Expand Up @@ -86,16 +91,28 @@ data NetworkConf = NetworkConf
instance FromJSON NetworkConf
instance ToJSON NetworkConf

newtype MicroarchitectureConf = MicroarchitectureConf
{ networks :: [NetworkConf]
data MicroarchitectureConf = MicroarchitectureConf
{ type' :: T.Text
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better to name it like valueType. ' can be confusing here.

In the future, it is possible to make type specific for each network.

, ioSync' :: IOSynchronization
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same idea on '

, networks :: [NetworkConf]
}
deriving (Generic, Show)

instance FromJSON MicroarchitectureConf
instance FromJSON MicroarchitectureConf where
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to do it via Generic?

Copy link
Collaborator Author

@dokerplp dokerplp Apr 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Didn't work out ¯\_(ツ)_/¯

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Strange. Maybe because you need to use HashMap instead of Map.

parseJSON (Object v) = do
type' <- v .: "type"
ioSync' <- v .: "ioSync"
networks <- v .: "networks"
return MicroarchitectureConf{type' = type', ioSync' = ioSync', networks = networks}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parseJSON v = fail $ show v
instance ToJSON MicroarchitectureConf

mkMicroarchitecture :: (Val v, Var x, ToJSON a, ToJSON x) => IOSynchronization -> HashMap T.Text a -> BusNetwork T.Text x v Int
mkMicroarchitecture ioSync toml =
parseConfig :: FilePath -> IO MicroarchitectureConf
parseConfig path = do
decodeFileThrow path :: IO MicroarchitectureConf

mkMicroarchitecture :: (Val v, Var x, ToJSON x) => MicroarchitectureConf -> BusNetwork T.Text x v Int
mkMicroarchitecture conf =
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use record syntax here

let addPU proto
| proto = addCustomPrototype
| otherwise = addCustom
Expand Down Expand Up @@ -125,8 +142,8 @@ mkMicroarchitecture ioSync toml =
, master_sclk = PU.OutputPortTag sclk
, master_cs = PU.OutputPortTag cs
}
nets = networks (getFromToml toml :: MicroarchitectureConf)
mkNetwork net@NetworkConf{name} = modifyNetwork (busNetwork name ioSync) (build net)
nets = networks conf
mkNetwork net@NetworkConf{name} = modifyNetwork (busNetwork name $ ioSync' conf) (build net)
in case nets of
[n] -> mkNetwork n
_ -> error "multi-networks are not currently supported"
32 changes: 10 additions & 22 deletions src/NITTA/Project/Template.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import Data.Maybe
import Data.String.Interpolate
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Data.Yaml
import GHC.Generics hiding (moduleName)
import NITTA.Project.Context
import NITTA.Project.Types
Expand All @@ -39,13 +40,15 @@ import System.FilePath
import System.Log.Logger
import System.Path.WildMatch
import Text.Ginger
import Text.Toml

data Conf = Conf
{ template :: TemplateConf
, signals :: M.HashMap T.Text T.Text
}
deriving (Show)
deriving (Generic, Show)

instance FromJSON Conf
instance ToJSON Conf

data TemplateConf = TemplateConf
{ nittaPath :: Maybe FilePath
Expand All @@ -54,7 +57,7 @@ data TemplateConf = TemplateConf
deriving (Generic, Show)

defNittaPath = "."
templateConfFileName = "template.toml"
templateConfFileName = "template.yml"

instance Default TemplateConf where
def =
Expand Down Expand Up @@ -86,26 +89,11 @@ collectNittaPath templates = do
where
getNittaPath = fromMaybe (error "internal error") . nittaPath . template

readTemplateConfDef :: FilePath -> IO Conf
readTemplateConfDef fn = do
text <-
doesFileExist fn >>= \case
True -> T.readFile fn
False -> return ""
let conf = either (error . show) id $ parseTomlDoc (fn <> ": parse error: ") text
return
Conf
{ template = confLookup fn "template" conf
, signals = confLookup fn "signals" conf
}

confLookup fn sec conf =
maybe
def
(unwrap (fn <> " in section [" <> T.unpack sec <> "]: ") . fromJSON . toJSON)
$ M.lookup sec conf
where
unwrap _prefix (Success a) = a
unwrap prefix (Error msg) = error $ prefix <> msg
doesFileExist fn >>= \case
True -> decodeFileThrow fn :: IO Conf
False -> return Conf{template = def, signals = def}

applyCustomSignal
signals
Expand Down
21 changes: 0 additions & 21 deletions src/NITTA/Utils.hs
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,9 @@ module NITTA.Utils (
getIntermediates,
isInstruction,
module NITTA.Utils.Base,

-- * Toml
getToml,
getFromToml,
getFromTomlSection,
) where

import Data.Aeson
import Data.Bits (setBit, testBit)
import Data.HashMap.Strict qualified as HM
import Data.List (sortOn)
import Data.Maybe
import Data.String.Utils qualified as S
Expand All @@ -56,7 +49,6 @@ import Numeric.Interval.NonEmpty (inf, sup, (...))
import Numeric.Interval.NonEmpty qualified as I
import Prettyprinter
import Prettyprinter.Render.Text
import Text.Toml (parseTomlDoc)

type Verilog = Doc ()
doc2text :: Verilog -> T.Text
Expand Down Expand Up @@ -129,16 +121,3 @@ stepsInterval ss =
in a ... b

stepStart Step{pInterval} = I.inf pInterval

getToml text = either (error . show) id $ parseTomlDoc "parse error: " text

getFromToml toml = getFromTomlSection T.empty toml

getFromTomlSection section toml
| section == T.empty = unwrap $ fromJSON $ toJSON toml
| otherwise = case HM.lookup section toml of
Just s -> unwrap $ fromJSON $ toJSON s
Nothing -> error $ "section not found - " <> T.unpack section
where
unwrap (Success conf) = conf
unwrap (Error msg) = error msg
Loading
Loading