-
Notifications
You must be signed in to change notification settings - Fork 6
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
base: master
Are you sure you want to change the base?
replace toml to yaml #276
Changes from 14 commits
bf08551
e34fd57
1ee11fc
48a2a43
dc9c38c
0a4056d
7240f35
627affd
c2e82e1
7238f81
c77c8bd
f63c40e
ebd687b
56e93fc
129f99b
4ffe9bd
a1c4904
9757aa0
8c8f454
f109211
6a61a5a
ae753ce
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
mock: true | ||
type: fx32.32 | ||
ioSync: Sync | ||
puLibrary: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm. Here we have misunderstanding. The idea behind this: describe library of process unit to be allocated in separated place, with name "library" intead of "proto" |
||
isSlave: true | ||
bufferSize: 6 | ||
bounceFilter: 0 | ||
networks: | ||
net1: | ||
pus: | ||
spi: | ||
type: SPI | ||
mosi: mosi | ||
miso: miso | ||
sclk: sclk | ||
cs: cs | ||
protos: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let move it to the top level as puLibrary. There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. |
||
fram{x}: # If you want a PU can be allocated only once, remove {x} from the PU name. | ||
type: Fram | ||
size: 32 | ||
shift{x}: | ||
type: Shift | ||
sRight: true | ||
mul{x}: | ||
type: Multiplier | ||
accum{x}: | ||
type: Accum | ||
isInt: true | ||
div{x}: | ||
type: Divider | ||
pipeline: 4 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,7 +61,7 @@ dependencies: | |
- data-default | ||
- filepath | ||
- ginger | ||
- htoml | ||
- yaml | ||
- intervals | ||
- mtl | ||
- prettyprinter | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,21 +3,32 @@ | |
{-# LANGUAGE PartialTypeSignatures #-} | ||
|
||
module NITTA.Model.Microarchitecture.Config ( | ||
MicroarchitectureConf (valueType, valueIoSync), | ||
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.Map as M ( | ||
Map, | ||
toList, | ||
) | ||
import Data.Maybe (fromMaybe) | ||
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) | ||
|
@@ -30,38 +41,34 @@ import NITTA.Model.Networks.Bus ( | |
) | ||
import NITTA.Model.Networks.Types (IOSynchronization) | ||
import NITTA.Model.ProcessorUnits qualified as PU | ||
import NITTA.Utils (getFromToml) | ||
|
||
data PULibrary = PULibrary | ||
{ isSlave :: Bool | ||
, bufferSize :: Maybe Int | ||
, bounceFilter :: Int | ||
} | ||
deriving (Generic, Show) | ||
|
||
instance FromJSON PULibrary | ||
instance ToJSON PULibrary | ||
|
||
data PUConf | ||
= Accum | ||
{ name :: T.Text | ||
} | ||
| Divider | ||
{ name :: T.Text | ||
, pipeline :: Int | ||
, mock :: Bool | ||
{ pipeline :: Int | ||
} | ||
| Multiplier | ||
{ name :: T.Text | ||
, mock :: Bool | ||
} | ||
| Fram | ||
{ name :: T.Text | ||
, size :: Int | ||
{ size :: Int | ||
} | ||
| SPI | ||
{ name :: T.Text | ||
, mosi :: T.Text | ||
{ mosi :: T.Text | ||
, miso :: T.Text | ||
, sclk :: T.Text | ||
, cs :: T.Text | ||
, isSlave :: Bool | ||
, bufferSize :: Maybe Int | ||
, bounceFilter :: Int | ||
} | ||
| Shift | ||
{ name :: T.Text | ||
, sRight :: Maybe Bool | ||
{ sRight :: Maybe Bool | ||
} | ||
deriving (Generic, Show) | ||
|
||
|
@@ -77,40 +84,59 @@ instance FromJSON PUConf where | |
parseJSON = genericParseJSON puConfJsonOptions | ||
|
||
data NetworkConf = NetworkConf | ||
{ name :: T.Text | ||
, pus :: [PUConf] | ||
, protos :: [PUConf] | ||
{ pus :: Maybe (Map T.Text PUConf) | ||
, protos :: Maybe (Map T.Text PUConf) | ||
} | ||
deriving (Generic, Show) | ||
|
||
instance FromJSON NetworkConf | ||
instance ToJSON NetworkConf | ||
|
||
newtype MicroarchitectureConf = MicroarchitectureConf | ||
{ networks :: [NetworkConf] | ||
data MicroarchitectureConf = MicroarchitectureConf | ||
{ mock :: Bool | ||
, valueType :: T.Text | ||
, valueIoSync :: IOSynchronization | ||
, puLibrary :: PULibrary | ||
, networks :: Map T.Text NetworkConf | ||
} | ||
deriving (Generic, Show) | ||
|
||
instance FromJSON MicroarchitectureConf | ||
instance FromJSON MicroarchitectureConf where | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it possible to do it via Generic? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Didn't work out ¯\_(ツ)_/¯ There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
mock <- v .: "mock" | ||
valueType <- v .: "type" | ||
valueIoSync <- v .: "ioSync" | ||
puLibrary <- v .: "puLibrary" | ||
networks <- v .: "networks" | ||
return MicroarchitectureConf{mock, valueType, valueIoSync, puLibrary, networks} | ||
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 MicroarchitectureConf{mock, valueIoSync, puLibrary, networks} = | ||
let addPU proto | ||
| proto = addCustomPrototype | ||
| otherwise = addCustom | ||
isSlave_ = isSlave puLibrary | ||
bufferSize_ = bufferSize puLibrary | ||
bounceFilter_ = bounceFilter puLibrary | ||
build NetworkConf{pus, protos} = do | ||
mapM_ (configure False) pus | ||
mapM_ (configure True) protos | ||
mapM_ (configure_ False) $ M.toList $ fromMaybe def pus | ||
mapM_ (configure_ True) $ M.toList $ fromMaybe def protos | ||
where | ||
configure proto Accum{name} = addPU proto name def PU.AccumIO | ||
configure proto Divider{name, pipeline, mock} = addPU proto name (PU.divider pipeline mock) PU.DividerIO | ||
configure proto Multiplier{name, mock} = addPU proto name (PU.multiplier mock) PU.MultiplierIO | ||
configure proto Fram{name, size} = addPU proto name (PU.framWithSize size) PU.FramIO | ||
configure proto Shift{name, sRight} = addPU proto name (PU.shift $ Just False /= sRight) PU.ShiftIO | ||
configure proto SPI{name, mosi, miso, sclk, cs, isSlave, bounceFilter, bufferSize} = | ||
addPU proto name (PU.anySPI bounceFilter bufferSize) $ | ||
if isSlave | ||
configure_ proto (name, pu) = configure proto name pu | ||
configure proto name Accum = addPU proto name def PU.AccumIO | ||
configure proto name Divider{pipeline} = addPU proto name (PU.divider pipeline mock) PU.DividerIO | ||
configure proto name Multiplier = addPU proto name (PU.multiplier mock) PU.MultiplierIO | ||
configure proto name Fram{size} = addPU proto name (PU.framWithSize size) PU.FramIO | ||
configure proto name Shift{sRight} = addPU proto name (PU.shift $ Just False /= sRight) PU.ShiftIO | ||
configure proto name SPI{mosi, miso, sclk, cs} = | ||
addPU proto name (PU.anySPI bounceFilter_ bufferSize_) $ | ||
if isSlave_ | ||
then | ||
PU.SPISlave | ||
{ slave_mosi = PU.InputPortTag mosi | ||
|
@@ -125,8 +151,7 @@ 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) | ||
in case nets of | ||
[n] -> mkNetwork n | ||
mkNetwork name net = modifyNetwork (busNetwork name valueIoSync) (build net) | ||
in case M.toList networks of | ||
[(name, net)] -> mkNetwork name net | ||
_ -> error "multi-networks are not currently supported" |
There was a problem hiding this comment.
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?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
parseConfig
is aFilePath -> IO MicroarchitectureConf
typepath
is aFilePath
type<$>
is a(a -> b) -> f a -> f b
typeThe result must be type of
IO Maybe MicroarchitectureConf
, soJust <$> parseConfig path
doesn't seem to be able to be simplified.