compMulticoreCMD :: MulticoreCMD (Param3 RunGen exp pred) a -> RunGen a
compMulticoreCMD (OnCore coreId comp) = do
    s <- genState
    let coreRef = CoreRefComp coreId
    compCore coreId
        $ evalGen s
        $ interpretT ((lift :: Run a -> CoreGen a) . liftRun)
        $ unCoreComp
        $ comp coreRef
    groupAddr <- gets group
    let (r, c) = groupCoord coreId
    lift $ addInclude "<e-loader.h>"
    lift $ callProc "e_load"
        [ strArg $ moduleName coreId ++ ".srec"
        , groupAddr
        , valArg $ value r
        , valArg $ value c
        , valArg (value 1 :: Data Int32) {- E_TRUE -}
        ]
    return coreRef
compMulticoreCMD :: MulticoreCMD (Param3 RunGen exp pred) a -> RunGen a
compMulticoreCMD (OnCore coreId comp) = do
    s <- genState
    let coreRef = CoreRefComp coreId
    compCore coreId
        $ evalGen s
        $ interpretT ((lift :: Run a -> CoreGen a) . liftRun)
        $ unCoreComp
        $ comp coreRef
    groupAddr <- gets group
    let (r, c) = groupCoord coreId
    lift $ addInclude "<e-loader.h>"
    lift $ callProc "e_load"
        [ strArg $ moduleName coreId ++ ".srec"
        , groupAddr
        , valArg $ value r
        , valArg $ value c
        , valArg (value 1 :: Data Int32) {- E_TRUE -}
        ]
    return coreRef
compMulticoreCMD (OnCore coreId comp) = do
    s <- genState
    let coreRef = CoreRefComp coreId
    compCore coreId
        $ evalGen s
        $ interpretT ((lift :: Run a -> CoreGen a) . liftRun)
        $ unCoreComp
        $ comp coreRef
    groupAddr <- gets group
    let (r, c) = groupCoord coreId
    lift $ addInclude "<e-loader.h>"
    lift $ callProc "e_load"
        [ strArg $ moduleName coreId ++ ".srec"
        , groupAddr
        , valArg $ value r
        , valArg $ value c
        , valArg (value 1 :: Data Int32) {- E_TRUE -}
        ]
    return coreRef