From c74ed4193418c92c36d57ba638c96acffb9fdaf9 Mon Sep 17 00:00:00 2001 From: tilk Date: Sat, 7 Oct 2023 10:23:28 +0000 Subject: [PATCH] Add generating API for transactron. (#469) --- .doctrees/api.doctree | Bin 30040 -> 31294 bytes .doctrees/environment.pickle | Bin 260344 -> 297574 bytes .doctrees/modules-coreblocks.doctree | Bin 0 -> 2668 bytes .doctrees/modules-transactron.doctree | Bin 0 -> 2675 bytes .doctrees/transactron.doctree | Bin 0 -> 888761 bytes Assumptions.html | 2 +- Current_graph.html | 2 +- Development_environment.html | 2 +- Home.html | 2 +- Problem-checklist.html | 2 +- Transactions.html | 2 +- _sources/api.md.txt | 5 +- _sources/modules-coreblocks.rst.txt | 7 + _sources/modules-transactron.rst.txt | 7 + _sources/transactron.rst.txt | 45 + api.html | 22 +- auto_graph.html | 2 +- components/icache.html | 2 +- coreblocks.frontend.html | 14 +- coreblocks.fu.html | 2 +- coreblocks.fu.unsigned_multiplication.html | 2 +- coreblocks.html | 2 +- coreblocks.params.html | 8 +- coreblocks.peripherals.html | 2 +- coreblocks.scheduler.html | 6 +- coreblocks.stages.html | 8 +- coreblocks.structs_common.html | 6 +- coreblocks.utils.html | 18 +- genindex.html | 433 ++++- index.html | 6 +- miscellany/exceptionsSummary.html | 2 +- modules-coreblocks.html | 208 ++ modules-transactron.html | 125 ++ objects.inv | Bin 6479 -> 7411 bytes py-modindex.html | 34 +- scheduler/Overview.html | 2 +- search.html | 2 +- searchindex.js | 2 +- shared_structs/Implementation/RS_impl.html | 2 +- shared_structs/RS.html | 2 +- synthesis/Synthesis.html | 2 +- transactron.html | 1985 ++++++++++++++++++++ 42 files changed, 2899 insertions(+), 76 deletions(-) create mode 100644 .doctrees/modules-coreblocks.doctree create mode 100644 .doctrees/modules-transactron.doctree create mode 100644 .doctrees/transactron.doctree create mode 100644 _sources/modules-coreblocks.rst.txt create mode 100644 _sources/modules-transactron.rst.txt create mode 100644 _sources/transactron.rst.txt create mode 100644 modules-coreblocks.html create mode 100644 modules-transactron.html create mode 100644 transactron.html diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree index 7a102a68abbcbee0aa3285148941f28d0524b1b7..12c95543f6640766702fd4220a1a0f4ffe2f6b80 100644 GIT binary patch delta 10570 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 IsCwG|4|FXrO8@`> delta 9607 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 E0P(*H?*IS* diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index f54dbfe093e19587b1195a221ca36ec59187f0a9..9b8ef26d3e86c40c74fcd60eefeead48a6e199b7 100644 GIT binary patch literal 297574 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 xT4%LY2Q1nriuzJn&e(~q%-Dl3-RwgV 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 literal 0 HcmV?d00001 diff --git a/Assumptions.html b/Assumptions.html index f047c5844..db57555c9 100644 --- a/Assumptions.html +++ b/Assumptions.html @@ -104,7 +104,7 @@

List of assumptions made during development

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

diff --git a/Current_graph.html b/Current_graph.html index 6673a38a8..ed40ff0f5 100644 --- a/Current_graph.html +++ b/Current_graph.html @@ -517,7 +517,7 @@

Full transaction-method graph

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

diff --git a/Development_environment.html b/Development_environment.html index cdb773f02..854f805e9 100644 --- a/Development_environment.html +++ b/Development_environment.html @@ -178,7 +178,7 @@

build_docs.sh

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

diff --git a/Home.html b/Home.html index aa2cbd836..bdb1bce2c 100644 --- a/Home.html +++ b/Home.html @@ -129,7 +129,7 @@

Documentation

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

diff --git a/Problem-checklist.html b/Problem-checklist.html index 1a40e1386..6888a779a 100644 --- a/Problem-checklist.html +++ b/Problem-checklist.html @@ -105,7 +105,7 @@

Problem checklist

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

diff --git a/Transactions.html b/Transactions.html index a6f672497..602d78c65 100644 --- a/Transactions.html +++ b/Transactions.html @@ -267,7 +267,7 @@

Transaction and method nesting

© Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

diff --git a/_sources/api.md.txt b/_sources/api.md.txt index ab2def980..5daa246b7 100644 --- a/_sources/api.md.txt +++ b/_sources/api.md.txt @@ -1,5 +1,6 @@ # API ```{eval-rst} -.. include:: modules.rst -``` \ No newline at end of file +.. include:: modules-coreblocks.rst +.. include:: modules-transactron.rst +``` diff --git a/_sources/modules-coreblocks.rst.txt b/_sources/modules-coreblocks.rst.txt new file mode 100644 index 000000000..a163e779b --- /dev/null +++ b/_sources/modules-coreblocks.rst.txt @@ -0,0 +1,7 @@ +coreblocks +========== + +.. toctree:: + :maxdepth: 4 + + coreblocks diff --git a/_sources/modules-transactron.rst.txt b/_sources/modules-transactron.rst.txt new file mode 100644 index 000000000..04795e606 --- /dev/null +++ b/_sources/modules-transactron.rst.txt @@ -0,0 +1,7 @@ +transactron +=========== + +.. toctree:: + :maxdepth: 4 + + transactron diff --git a/_sources/transactron.rst.txt b/_sources/transactron.rst.txt new file mode 100644 index 000000000..c39770fb0 --- /dev/null +++ b/_sources/transactron.rst.txt @@ -0,0 +1,45 @@ +transactron package +=================== + +Submodules +---------- + +transactron.core module +----------------------- + +.. automodule:: transactron.core + :members: + :undoc-members: + :show-inheritance: + +transactron.graph module +------------------------ + +.. automodule:: transactron.graph + :members: + :undoc-members: + :show-inheritance: + +transactron.lib module +---------------------- + +.. automodule:: transactron.lib + :members: + :undoc-members: + :show-inheritance: + +transactron.tracing module +-------------------------- + +.. automodule:: transactron.tracing + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: transactron + :members: + :undoc-members: + :show-inheritance: diff --git a/api.html b/api.html index 4ce01b157..349c42b86 100644 --- a/api.html +++ b/api.html @@ -58,6 +58,10 @@
  • coreblocks package
  • +
  • transactron +
  • @@ -187,6 +191,22 @@

    coreblocks +

    transactron

    + + @@ -201,7 +221,7 @@

    coreblocks

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/auto_graph.html b/auto_graph.html index 9e26b5ac9..9e076984f 100644 --- a/auto_graph.html +++ b/auto_graph.html @@ -509,7 +509,7 @@

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/components/icache.html b/components/icache.html index 936d4bcf1..68e6aa55d 100644 --- a/components/icache.html +++ b/components/icache.html @@ -131,7 +131,7 @@

    Address mapping example

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.frontend.html b/coreblocks.frontend.html index 1861f1a13..c79de9603 100644 --- a/coreblocks.frontend.html +++ b/coreblocks.frontend.html @@ -98,7 +98,7 @@

    Submodules
    -__init__(gen_params: GenParams, get_raw: Method, push_decoded: Method) None
    +__init__(gen_params: GenParams, get_raw: Method, push_decoded: Method) None
    Parameters
    @@ -203,7 +203,7 @@

    Submodules
    -__init__(gen_params: GenParams, icache: ICacheInterface, cont: Method) None
    +__init__(gen_params: GenParams, icache: ICacheInterface, cont: Method) None
    Parameters
    @@ -229,7 +229,7 @@

    Submodules
    -__init__(gen_params: GenParams, icache: ICacheInterface, cont: Method) None
    +__init__(gen_params: GenParams, icache: ICacheInterface, cont: Method) None
    Parameters
    @@ -331,17 +331,17 @@

    Submodules
    -accept_res: Method
    +accept_res: Method

    -flush: Method
    +flush: Method
    -issue_req: Method
    +issue_req: Method
    @@ -404,7 +404,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.fu.html b/coreblocks.fu.html index 038863b2b..86d59754a 100644 --- a/coreblocks.fu.html +++ b/coreblocks.fu.html @@ -796,7 +796,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.fu.unsigned_multiplication.html b/coreblocks.fu.unsigned_multiplication.html index 43ab00b98..92437d06d 100644 --- a/coreblocks.fu.unsigned_multiplication.html +++ b/coreblocks.fu.unsigned_multiplication.html @@ -237,7 +237,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.html b/coreblocks.html index d9257e61f..4bb4a2d2b 100644 --- a/coreblocks.html +++ b/coreblocks.html @@ -218,7 +218,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.params.html b/coreblocks.params.html index 347c9147a..c3106a30b 100644 --- a/coreblocks.params.html +++ b/coreblocks.params.html @@ -1952,7 +1952,7 @@

    Submodules
    unifier
    -

    alias of Collector

    +

    alias of Collector

    @@ -1960,7 +1960,7 @@

    Submodules
    class coreblocks.params.keys.ExceptionReportKey
    -

    Bases: SimpleKey[Method]

    +

    Bases: SimpleKey[Method]

    __init__() None
    @@ -1991,7 +1991,7 @@

    Submodules
    unifier
    -

    alias of MethodTryProduct

    +

    alias of MethodTryProduct

    @@ -2363,7 +2363,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.peripherals.html b/coreblocks.peripherals.html index 9e8ea079f..9829f061d 100644 --- a/coreblocks.peripherals.html +++ b/coreblocks.peripherals.html @@ -348,7 +348,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.scheduler.html b/coreblocks.scheduler.html index f03ffd115..88df9ac02 100644 --- a/coreblocks.scheduler.html +++ b/coreblocks.scheduler.html @@ -108,7 +108,7 @@

    Submodules
    -__init__(*, get_instr: Method, get_free_reg: Method, rat_rename: Method, rob_put: Method, rf_read1: Method, rf_read2: Method, reservation_stations: Sequence[tuple[coreblocks.utils.protocols.FuncBlock, set[coreblocks.params.optypes.OpType]]], gen_params: GenParams)
    +__init__(*, get_instr: Method, get_free_reg: Method, rat_rename: Method, rob_put: Method, rf_read1: Method, rf_read2: Method, reservation_stations: Sequence[tuple[coreblocks.utils.protocols.FuncBlock, set[coreblocks.params.optypes.OpType]]], gen_params: GenParams)
    Parameters
    @@ -154,7 +154,7 @@

    Submodules
    -__init__(*, gen_params: GenParams, get_ready: Method, take_row: Method, issue: Method)
    +__init__(*, gen_params: GenParams, get_ready: Method, take_row: Method, issue: Method)
    Parameters
    @@ -191,7 +191,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.stages.html b/coreblocks.stages.html index ed6420019..3e94808e3 100644 --- a/coreblocks.stages.html +++ b/coreblocks.stages.html @@ -103,7 +103,7 @@

    Submodules
    -__init__(*, gen: GenParams, get_result: Method, rob_mark_done: Method, rs_write_val: Method, rf_write_val: Method)
    +__init__(*, gen: GenParams, get_result: Method, rob_mark_done: Method, rs_write_val: Method, rf_write_val: Method)
    Parameters
    @@ -150,7 +150,7 @@

    Submodules
    -get_extra_method(item: UnifierKey) Method
    +get_extra_method(item: UnifierKey) Method

    @@ -164,7 +164,7 @@

    SubmodulesElaboratable

    -__init__(gen_params: GenParams, *, rob_peek: Method, rob_retire: Method, r_rat_commit: Method, free_rf_put: Method, rf_free: Method, precommit: Method, exception_cause_get: Method)
    +__init__(gen_params: GenParams, *, rob_peek: Method, rob_retire: Method, r_rat_commit: Method, free_rf_put: Method, rf_free: Method, precommit: Method, exception_cause_get: Method)

    @@ -266,7 +266,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.structs_common.html b/coreblocks.structs_common.html index 5856b8069..6d16afa88 100644 --- a/coreblocks.structs_common.html +++ b/coreblocks.structs_common.html @@ -351,14 +351,14 @@

    SubmodulesElaboratable

    -__init__(gp: GenParams, rob_get_indices: Method)
    +__init__(gp: GenParams, rob_get_indices: Method)

    -coreblocks.structs_common.exception.should_update_prioriy(m: TModule, current_cause: Value, new_cause: Value) Value
    +coreblocks.structs_common.exception.should_update_prioriy(m: TModule, current_cause: Value, new_cause: Value) Value
    @@ -446,7 +446,7 @@

    Submodules

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/coreblocks.utils.html b/coreblocks.utils.html index a060bb719..34b60dc3b 100644 --- a/coreblocks.utils.html +++ b/coreblocks.utils.html @@ -20,6 +20,7 @@ + @@ -173,22 +174,22 @@

    Submodules
    -get_result: Method
    +get_result: Method

    -insert: Method
    +insert: Method
    -select: Method
    +select: Method
    -update: Method
    +update: Method
    @@ -204,12 +205,12 @@

    Submodules
    -accept: Method
    +accept: Method

    -issue: Method
    +issue: Method
    @@ -225,7 +226,7 @@

    Submodules
    -method: Method
    +method: Method
    @@ -459,13 +460,14 @@

    Submodules +

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/genindex.html b/genindex.html index a59caa45e..0c204333d 100644 --- a/genindex.html +++ b/genindex.html @@ -307,6 +307,68 @@

    _

  • (coreblocks.utils.protocols.Unifier method)
  • (coreblocks.utils.utils.ModuleConnector method) +
  • +
  • (transactron.core.Method method) +
  • +
  • (transactron.core.TModule method) +
  • +
  • (transactron.core.Transaction method) +
  • +
  • (transactron.core.TransactionContext method) +
  • +
  • (transactron.core.TransactionManager method) +
  • +
  • (transactron.core.TransactionModule method) +
  • +
  • (transactron.graph.OwnershipGraph method) +
  • +
  • (transactron.lib.Adapter method) +
  • +
  • (transactron.lib.AdapterTrans method) +
  • +
  • (transactron.lib.CatTrans method) +
  • +
  • (transactron.lib.ClickIn method) +
  • +
  • (transactron.lib.ClickOut method) +
  • +
  • (transactron.lib.Collector method) +
  • +
  • (transactron.lib.Connect method) +
  • +
  • (transactron.lib.ConnectAndTransformTrans method) +
  • +
  • (transactron.lib.ConnectTrans method) +
  • +
  • (transactron.lib.FIFO method) +
  • +
  • (transactron.lib.Forwarder method) +
  • +
  • (transactron.lib.ManyToOneConnectTrans method) +
  • +
  • (transactron.lib.MemoryBank method) +
  • +
  • (transactron.lib.MethodFilter method) +
  • +
  • (transactron.lib.MethodProduct method) +
  • +
  • (transactron.lib.MethodTransformer method) +
  • +
  • (transactron.lib.MethodTryProduct method) +
  • +
  • (transactron.lib.Serializer method) +
  • +
  • (transactron.Method method) +
  • +
  • (transactron.TModule method) +
  • +
  • (transactron.Transaction method) +
  • +
  • (transactron.TransactionContext method) +
  • +
  • (transactron.TransactionManager method) +
  • +
  • (transactron.TransactionModule method)
  • @@ -336,6 +398,10 @@

    A

  • accept (coreblocks.utils.protocols.FuncUnit attribute)
  • accept_res (coreblocks.frontend.icache.ICacheInterface attribute) +
  • +
  • Adapter (class in transactron.lib) +
  • +
  • AdapterTrans (class in transactron.lib)
  • ADD (coreblocks.params.isa.Funct3 attribute) @@ -345,10 +411,16 @@

    A

  • add_dependency() (coreblocks.params.dependencies.DependencyManager method)
  • -
  • ADDRESS_GENERATION (coreblocks.params.optypes.OpType attribute) +
  • add_transaction() (transactron.core.TransactionManager method) + +
  • auto_debug_signals() (in module coreblocks.utils.debug_signals)
  • +
  • AvoidedIf() (transactron.core.TModule method) + +
  • @@ -431,10 +509,10 @@

    B

  • (coreblocks.params.isa.Funct7 attribute)
  • - - + - + @@ -1757,6 +2027,10 @@

    R

  • (coreblocks.params.isa.Funct3 attribute)
  • +
  • remember() (transactron.graph.OwnershipGraph method) +
  • +
  • remember_field() (transactron.graph.OwnershipGraph method) +
  • REMU (coreblocks.fu.div_unit.DivFn.Fn attribute)
  • - - + @@ -1999,8 +2297,6 @@

    T

  • T4 (coreblocks.params.isa.Registers attribute)
  • - - + +

    W

    @@ -2272,7 +2661,7 @@

    Z

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/index.html b/index.html index 8abe6c325..02de1ed30 100644 --- a/index.html +++ b/index.html @@ -193,6 +193,10 @@

    Coreblockscoreblocks package +
  • transactron +
  • @@ -210,7 +214,7 @@

    Coreblocks

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/miscellany/exceptionsSummary.html b/miscellany/exceptionsSummary.html index e060f882f..56c4f455a 100644 --- a/miscellany/exceptionsSummary.html +++ b/miscellany/exceptionsSummary.html @@ -271,7 +271,7 @@

    Summary

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/modules-coreblocks.html b/modules-coreblocks.html new file mode 100644 index 000000000..10318b104 --- /dev/null +++ b/modules-coreblocks.html @@ -0,0 +1,208 @@ + + + + + + coreblocks — Coreblocks documentation + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    coreblocks

    +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +

    © Copyright Kuźnia Rdzeni, 2023. + Last updated on 10:23 2023-10-07. +

    +
    + + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/modules-transactron.html b/modules-transactron.html new file mode 100644 index 000000000..5312e8f4d --- /dev/null +++ b/modules-transactron.html @@ -0,0 +1,125 @@ + + + + + + transactron — Coreblocks documentation + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv index 3098f8adf6476ba850c0efe249e8a5798dd43c5d..90b245346154f0997ad488a2022cc98ac199b856 100644 GIT binary patch delta 7339 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 N?)bK?{|E0Q!Python Module Index

    - c + c | + t
    @@ -377,6 +378,35 @@

    Python Module Index

    + + + + + + + + + + + + + + + + +
        coreblocks.utils.utils
     
    + t
    + transactron +
        + transactron.core +
        + transactron.graph +
        + transactron.lib +
        + transactron.tracing +
    @@ -388,7 +418,7 @@

    Python Module Index

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/scheduler/Overview.html b/scheduler/Overview.html index f44b1b625..b1ae161ef 100644 --- a/scheduler/Overview.html +++ b/scheduler/Overview.html @@ -146,7 +146,7 @@

    More detailed description of each block

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/search.html b/search.html index fd74b4bed..4ade9dadb 100644 --- a/search.html +++ b/search.html @@ -101,7 +101,7 @@

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/searchindex.js b/searchindex.js index a0edbf41b..ed350e5ed 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["Assumptions", "Current_graph", "Development_environment", "Home", "Problem-checklist", "Transactions", "api", "auto_graph", "components/icache", "coreblocks", "coreblocks.frontend", "coreblocks.fu", "coreblocks.fu.unsigned_multiplication", "coreblocks.params", "coreblocks.peripherals", "coreblocks.scheduler", "coreblocks.stages", "coreblocks.structs_common", "coreblocks.utils", "index", "miscellany/exceptionsSummary", "modules", "scheduler/Overview", "shared_structs/Implementation/RS_impl", "shared_structs/RS", "synthesis/Synthesis"], "filenames": ["Assumptions.md", "Current_graph.md", "Development_environment.md", "Home.md", "Problem-checklist.md", "Transactions.md", "api.md", "auto_graph.rst", "components/icache.md", "coreblocks.rst", "coreblocks.frontend.rst", "coreblocks.fu.rst", "coreblocks.fu.unsigned_multiplication.rst", "coreblocks.params.rst", "coreblocks.peripherals.rst", "coreblocks.scheduler.rst", "coreblocks.stages.rst", "coreblocks.structs_common.rst", "coreblocks.utils.rst", "index.md", "miscellany/exceptionsSummary.md", "modules.rst", "scheduler/Overview.md", "shared_structs/Implementation/RS_impl.md", "shared_structs/RS.md", "synthesis/Synthesis.md"], "titles": ["List of assumptions made during development", "Full transaction-method graph", "Development environment", "Introduction", "Problem checklist", "Documentation for Coreblocks transaction framework", "API", "<no title>", "Instruction Cache", "coreblocks package", "coreblocks.frontend package", "coreblocks.fu package", "coreblocks.fu.unsigned_multiplication package", "coreblocks.params package", "coreblocks.peripherals package", "coreblocks.scheduler package", "coreblocks.stages package", "coreblocks.structs_common package", "coreblocks.utils package", "Coreblocks", "Summary of papers about interrupts", "coreblocks", "Scheduler overview", "Proposition of Reservation Station implementation", "Reservation Station", "Synthesis"], "terms": {"rf": [0, 6, 9, 16, 20, 21, 23, 24], "ha": [0, 2, 4, 10, 15, 17, 18, 20, 23], "data": [0, 10, 13, 14, 17, 18, 19, 24], "forward": 0, "from": [0, 2, 3, 4, 5, 10, 13, 14, 15, 16, 17, 18, 20, 23, 24, 25], "tomasulo": 0, "announc": [0, 16, 17], "bu": [0, 13, 14], "read": [0, 4, 5, 13, 14, 17, 18, 19], "x0": [0, 13], "rf0": 0, "return": [0, 5, 8, 11, 13, 14, 18, 20], "0": [0, 10, 11, 13, 15, 17, 23, 24], "write": [0, 5, 10, 17, 18, 20, 24], "i": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 23, 24, 25], "noop": 0, "separ": [0, 22], "r": [0, 2, 6, 9, 13, 15, 16, 20, 21, 22, 23, 24], "each": [0, 10, 11, 13, 14, 17, 19, 20, 23, 24, 25], "fu": [0, 6, 9, 13, 16, 17, 21, 23, 24], "writeback": 0, "stage": [0, 6, 9, 17, 21], "save": [0, 2, 13, 16, 20, 23, 24, 25], "rob": [0, 6, 9, 15, 16, 20, 21, 22, 23, 24], "after": [0, 5, 8, 10, 14, 20, 22], "get": [0, 2, 10, 11, 12, 13, 15, 16, 18, 19], "output": [0, 2, 10, 14, 16, 17, 20, 23, 24, 25], "commit": [0, 2, 17, 20, 25], "updat": [0, 16, 17, 18], "rat": [0, 6, 9, 15, 20, 21], "In": [2, 3, 5, 15, 18, 19, 24, 25], "order": [2, 3, 5, 8, 13, 15, 19, 25], "prepar": [2, 15, 20], "pleas": [2, 4, 5, 13], "follow": [2, 5, 8, 11, 15, 18, 23, 25], "step": [2, 5, 10, 15, 20], "below": 2, "instal": [2, 25], "python": [2, 5, 18], "3": [2, 11, 13, 17, 18], "10": [2, 8, 13, 20], "interpret": [2, 13], "pip": 2, "packag": [2, 6, 19, 21], "manag": [2, 11, 13, 19], "option": [2, 5, 11, 13, 17, 18], "creat": [2, 10, 12, 18], "virtual": 2, "python3": 2, "m": [2, 5, 13, 17, 18, 20], "venv": 2, "project": [2, 3, 20, 25], "directori": [2, 3], "activ": 2, "gener": [2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 25], "bin": 2, "all": [2, 4, 5, 13, 14, 17, 18, 19, 20, 25], "requir": [2, 8, 17, 19, 20], "librari": [2, 19], "pip3": 2, "dev": 2, "txt": 2, "riscv64": 2, "unknown": [2, 13], "elf": 2, "binutil": 2, "your": [2, 4], "favourit": 2, "On": 2, "debian": 2, "base": [2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20], "distro": 2, "call": [2, 4, 5, 10, 15, 17, 23], "arch": [2, 13], "precommit": [2, 16], "hook": 2, "pre": 2, "thi": [2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 23, 24, 25], "automat": [2, 17, 18], "run": [2, 5, 25], "linter": 2, "befor": [2, 4, 13, 14, 22], "The": [2, 3, 8, 10, 11, 13, 14, 16, 18, 19, 20, 22, 23, 24], "contain": [2, 5, 13, 18], "number": [2, 12, 13, 14, 16, 18, 20, 25], "which": [2, 3, 5, 8, 10, 11, 15, 16, 18, 20, 22, 23, 24], "ar": [2, 3, 4, 5, 8, 13, 14, 16, 17, 18, 20, 22, 23, 24, 25], "ci": [2, 25], "also": [2, 5, 16], "intend": 2, "local": [2, 13], "thei": [2, 5, 14, 17, 20, 22], "unit": [2, 8, 10, 11, 12, 13, 14, 15, 16, 17, 22], "test": [2, 4, 13, 18, 25], "By": 2, "default": [2, 13, 14, 18], "everi": [2, 10, 11, 14], "avail": [2, 3, 13, 14, 15, 17, 25], "specif": [2, 8, 13, 20], "file": [2, 13, 18, 20], "can": [2, 3, 5, 8, 13, 14, 16, 17, 18, 20, 22, 23, 25], "test_transact": 2, "an": [2, 3, 4, 5, 8, 10, 11, 13, 15, 16, 17, 18, 20, 23], "exampl": [2, 5, 13, 17, 18, 19, 23, 25], "One": [2, 18, 20], "even": [2, 20], "class": [2, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "testschedul": 2, "Or": [2, 5], "method": [2, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "test_singl": 2, "argument": [2, 5, 14, 15, 18, 24], "actual": [2, 10, 19], "search": 2, "within": [2, 12], "full": [2, 13, 18, 19, 20], "name": [2, 5, 18, 25], "match": [2, 18, 23, 24], "queri": 2, "thank": 2, "given": [2, 5, 18, 23], "uniqu": 2, "just": [2, 5], "l": [2, 13], "list": [2, 4, 10, 11, 13, 14, 17, 18, 19], "help": [2, 20, 25], "e": [2, 4, 10, 13, 18, 20], "g": [2, 4, 10, 13, 18, 20], "find": [2, 20], "parameter": 2, "t": [2, 4, 5, 10, 13, 18, 20, 23, 25], "trace": 2, "waveform": 2, "vcd": 2, "format": [2, 5, 11, 18], "gtkw": [2, 18], "gtkwave": [2, 18], "tool": [2, 12, 25], "__traces__": 2, "debug": [2, 18], "driven": 2, "v": [2, 3, 8, 13, 20, 23], "verbos": [2, 25], "make": [2, 3, 4, 10, 11, 20], "runner": 2, "more": [2, 16, 19, 20, 25], "It": [2, 5, 10, 11, 12, 13, 15, 16, 20, 22, 23], "print": 2, "being": [2, 14, 18], "check": [2, 4, 18, 20, 23, 24], "code": [2, 3, 4, 5, 18, 20], "type": [2, 10, 11, 13, 18], "should": [2, 3, 5, 8, 10, 13, 14, 15, 16, 18, 20, 22, 23, 24], "subcommand": 2, "filenam": 2, "main": [2, 20, 22], "reformat": 2, "black": 2, "check_format": 2, "verifi": 2, "flake8": 2, "check_typ": 2, "pyright": 2, "same": [2, 5, 12, 13, 18], "when": [2, 4, 5, 10, 14, 18, 20, 23, 24], "confront": 2, "would": [2, 13, 20], "messag": 2, "you": [2, 4, 23, 25], "mai": [2, 25], "diff": 2, "wai": [2, 5, 10, 11, 13, 20], "displai": 2, "chang": [2, 5, 23], "appli": [2, 4, 20], "chose": 2, "locat": [2, 3, 22], "issu": [2, 8, 10, 11, 12, 15, 18], "visual": 2, "core": [2, 6, 10, 11, 12, 13, 15, 16, 17, 20, 21, 25], "architectur": [2, 20], "graph": [2, 19, 25], "one": [2, 5, 8, 10, 11, 14, 16, 18, 20, 22, 23, 24], "support": [2, 10, 13, 15, 19], "need": [2, 5, 10, 14, 20, 23, 25], "pass": [2, 5, 16, 17, 18], "appropri": [2, 23], "p": [2, 13], "prune": 2, "remov": [2, 20], "disconnect": 2, "node": 2, "f": [2, 13, 15, 25], "select": [2, 10, 11, 14, 15, 16, 17, 18], "elk": 2, "eclips": 2, "layout": [2, 4, 5, 6, 9, 10, 14, 15, 16, 18, 21], "kernel": [2, 20], "dot": 2, "graphviz": 2, "mermaid": 2, "document": [2, 19], "sphinx": 2, "html": [2, 3], "build": [2, 25], "coreblock": [3, 4, 25], "go": [3, 4, 20], "out": [3, 10, 11, 12, 14, 16, 19], "processor": [3, 19, 22], "implement": [3, 11, 13, 14, 19, 20, 22], "risc": [3, 8, 13], "microarchitectur": 3, "focu": 3, "flexibl": [3, 22], "allow": [3, 13, 18, 20], "easili": 3, "experi": 3, "differ": [3, 4, 11, 13, 14, 16, 20], "compon": [3, 10, 13], "doc": 3, "collect": [3, 13, 16, 17, 25], "descript": [3, 19], "whole": [3, 10, 20], "overview": [3, 19, 20], "high": 3, "level": [3, 13, 20], "found": 3, "version": 3, "page": [3, 20], "api": [3, 19], "kuznia": 3, "rdzeni": 3, "github": 3, "io": 3, "If": [4, 5, 8, 10, 13, 14, 17, 18, 20, 23], "someth": [4, 5], "doesn": [4, 5, 18, 20], "work": [4, 5, 10, 15, 20], "re": [4, 5, 14, 20], "puzzl": 4, "why": 4, "through": 4, "see": [4, 5, 12], "ani": [4, 8, 10, 13, 14, 15, 18, 20], "point": [4, 13, 20], "case": [4, 8, 14, 15, 16, 18, 20], "sure": 4, "us": [4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25], "yield": 4, "function": [4, 5, 10, 11, 13, 15, 16, 18, 20, 25], "testbenchio": 4, "notabl": 4, "except": [4, 6, 9, 13, 16, 18, 19, 21], "settl": 4, "instead": [4, 5, 20], "signal": [4, 10, 11, 14, 18, 19], "unexpect": 4, "valu": [4, 10, 11, 13, 14, 15, 16, 17, 18, 23, 24], "try": [4, 5, 20], "ad": [4, 13, 18, 25], "right": 4, "don": [4, 20, 23], "do": [4, 10, 13, 20], "eq": [4, 5], "two": [4, 5, 10, 16, 17, 18, 20], "record": [4, 5, 10, 11, 14, 18], "assign": [4, 5, 17, 18], "util": [4, 5, 6, 9, 15, 16, 21], "amaranth": [4, 5, 10, 13, 14, 18, 25], "statement": [4, 5, 18], "some": [4, 5, 17, 20, 25], "domain": 4, "have": [4, 8, 13, 14, 16, 17, 18, 20, 25], "combin": [4, 13, 16], "loop": 4, "especi": 4, "simul": 4, "hang": 4, "extend": [4, 13], "spot": 4, "yourself": [4, 5, 25], "easi": [4, 5, 20], "fix": 4, "mistak": 4, "modular": 5, "design": [5, 12, 20], "inspir": 5, "bluespec": 5, "program": [5, 13, 20], "languag": [5, 13], "wiki": 5, "compil": [5, 25], "idea": [5, 20], "interfac": [5, 10, 12, 14, 15, 16, 17, 19], "hardwar": [5, 13, 19, 22], "modul": [5, 6, 21], "A": [5, 10, 13], "state": [5, 14, 19, 20], "oper": [5, 8, 10, 11, 13, 20], "perform": [5, 10, 11, 12, 13, 15, 17, 18, 25], "singl": [5, 11, 12, 13, 15, 16, 18], "clock": [5, 12, 22, 25], "cycl": [5, 8, 11, 12, 14, 17, 20, 22], "atom": [5, 13, 23], "either": [5, 10, 18], "execut": [5, 11, 13, 14, 15, 16, 19, 22, 24], "its": [5, 10, 15, 16, 17, 18, 20], "entrieti": 5, "onli": [5, 11, 17, 18, 20], "readi": [5, 10, 14, 15, 16, 17, 18, 19, 23], "doe": 5, "conflict": 5, "anoth": [5, 8, 10], "schedul": [5, 6, 9, 19, 20, 21], "defin": [5, 10, 17, 18], "depend": [5, 6, 9, 17, 18, 21], "other": [5, 17, 19], "via": [5, 10], "directli": [5, 13], "link": 5, "indirectli": 5, "multipl": [5, 8, 11, 12, 13, 14, 15, 16], "them": [5, 13, 18, 20], "access": [5, 8, 13, 17, 20], "coordin": 5, "system": [5, 13], "avoid": 5, "commun": [5, 20, 23], "caller": 5, "both": [5, 18, 23], "direct": [5, 18], "back": 5, "structur": [5, 18, 19, 20, 23], "simplest": 5, "part": [5, 17, 20, 22], "elaborat": [5, 9, 10, 11, 12, 14, 15, 16, 17, 18], "block": [5, 8, 12, 13, 14, 15, 16, 19, 20], "myth": 5, "def": 5, "elabor": 5, "self": 5, "platform": [5, 25], "tmodul": [5, 17], "bodi": [5, 17], "condit": 5, "includ": [5, 18], "like": [5, 8, 10, 14, 20], "d": [5, 13], "comb": 5, "sig1": 5, "expr1": 5, "sync": 5, "sig2": 5, "expr2": 5, "result": [5, 8, 10, 11, 12, 13, 14, 16, 17, 18, 20], "arg_expr": 5, "analog": 5, "": [5, 13, 14, 18, 20], "multiplex": 5, "rememb": [5, 20], "insid": [5, 10], "alwai": [5, 8, 17], "onc": 5, "becaus": [5, 20], "resourc": [5, 11, 20, 25], "request": [5, 8, 10, 11, 12, 13, 14], "paramet": [5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 25], "bit": [5, 8, 10, 11, 12, 13, 14, 17, 18, 20, 23, 24], "express": 5, "expr": 5, "As": [5, 8, 20], "typic": 5, "declar": 5, "constructor": [5, 10], "myotherth": 5, "__init__": [5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "o": [5, 12, 20], "my_method": 5, "input_layout": 5, "output_layout": 5, "def_method": 5, "_": 5, "arg": [5, 10, 11, 18], "other_method": 5, "ret_expr": 5, "techniqu": 5, "present": [5, 18, 20], "abov": 5, "conveni": 5, "syntax": 5, "particular": 5, "unnam": 5, "usual": [5, 20], "For": [5, 8, 13, 18, 23, 24, 25], "could": 5, "around": 5, "entir": [5, 8], "sometim": 5, "might": 5, "altern": 5, "decid": [5, 20, 22], "best": 5, "import": [5, 20], "question": 5, "ask": 5, "independ": [5, 8], "thing": [5, 18], "lock": [5, 20], "so": [5, 14, 16, 20], "mayb": [5, 20], "extern": [5, 19], "doubt": 5, "prefer": 5, "noth": 5, "els": [5, 17, 20], "Such": 5, "adaptertran": 5, "facilit": 5, "provid": [5, 10, 11, 13, 15, 17], "most": [5, 8, 20], "ones": 5, "connecttran": 5, "connect": [5, 10, 14, 16, 17, 20], "togeth": 5, "fifo": [5, 6, 9, 16, 20, 21], "queue": [5, 18, 20], "adapt": 5, "plain": 5, "These": [5, 20, 25], "veri": [5, 20], "testbench": 5, "parent": 5, "convers": 5, "true": [5, 13, 14, 18], "possibl": [5, 18, 20], "limit": [5, 14], "impli": 5, "consid": [5, 20], "subpackag": [6, 21], "frontend": [6, 9, 21, 22], "submodul": [6, 21], "decod": [6, 9, 11, 15, 21], "fetch": [6, 8, 9, 13, 16, 17, 20, 21], "icach": [6, 9, 21], "rvc": [6, 9, 21], "content": [6, 21], "alu": [6, 9, 13, 21], "div_unit": [6, 9, 21], "fu_decod": [6, 9, 21], "jumpbranch": [6, 9, 13, 21], "mul_unit": [6, 9, 21], "shift_unit": [6, 9, 13, 21], "zbc": [6, 9, 13, 21], "zb": [6, 9, 13, 21], "param": [6, 9, 10, 11, 15, 16, 17, 21], "configur": [6, 9, 15, 21], "fu_param": [6, 9, 21], "genparam": [6, 9, 10, 11, 12, 15, 16, 17, 21], "icache_param": [6, 9, 21], "instr": [6, 9, 10, 21], "isa": [6, 9, 10, 17, 21], "kei": [6, 9, 17, 18, 21], "optyp": [6, 9, 10, 11, 15, 16, 17, 21], "peripher": [6, 9, 21], "wishbon": [6, 9, 21], "wakeup_select": [6, 9, 21], "backend": [6, 9, 21], "func_blocks_unifi": [6, 9, 21], "retir": [6, 9, 21], "rs_func_block": [6, 9, 21], "structs_common": [6, 9, 21], "csr": [6, 9, 10, 13, 21], "csr_gener": [6, 9, 21], "debug_sign": [6, 9, 16, 21], "protocol": [6, 9, 10, 15, 16, 21], "expos": [8, 18], "three": [8, 10, 20], "issue_req": [8, 10], "lookup": [8, 10], "accept_resp": 8, "flush": [8, 10, 20], "under": 8, "4": [8, 11, 13], "byte": [8, 13], "align": [8, 18], "c": [8, 13, 20], "extens": [8, 13], "introduc": [8, 20], "16": [8, 13, 20], "relax": 8, "handl": [8, 11, 19], "fulli": 8, "pipelin": [8, 14, 15, 17, 20, 23], "process": [8, 19], "invok": [8, 10, 15, 16, 20, 23], "accept_r": [8, 10], "space": [8, 20], "simpli": 8, "latenc": [8, 20], "least": 8, "miss": [8, 20], "occur": [8, 10], "arbitrarili": 8, "long": [8, 24], "ensur": 8, "refetch": 8, "howev": 8, "guarante": [8, 20], "alreadi": [8, 13, 16, 20], "been": 8, "still": [8, 20, 24], "wait": [8, 14, 16, 20, 23, 24], "accept": [8, 10, 11, 12, 17, 18], "inform": [8, 15, 25], "regard": 8, "error": [8, 10, 14, 18], "mean": [8, 15, 24], "dure": [8, 19, 22], "line": [8, 10, 13, 19], "refil": [8, 10], "subsequ": 8, "trigger": [8, 17], "32": [8, 11, 12, 13, 20], "128": [8, 13], "set": [8, 10, 11, 13, 15, 16, 17, 19, 23], "size": [8, 13, 14, 18, 20], "equal": 8, "31": [8, 13], "15": [8, 13], "14": [8, 13], "13": [8, 13], "12": [8, 13], "11": [8, 13], "09": 8, "08": 8, "07": 8, "06": 8, "05": 8, "04": 8, "03": 8, "02": 8, "01": 8, "00": 8, "tag": [8, 14, 16, 20, 23, 24], "index": [8, 18], "offset": 8, "unsigned_multipl": [9, 11], "common": [9, 11, 18], "fast_recurs": [9, 11], "sequenc": [9, 11, 15, 18], "shift": [9, 11, 13], "gen_param": [9, 10, 11, 13, 15, 16, 17], "wb_instr_bu": 9, "wishbonebu": [9, 14], "wb_data_bu": 9, "simpl": [10, 15, 16, 18], "transact": [10, 13, 14, 17, 18, 19, 23], "instanti": 10, "instrdecod": 10, "combinatori": 10, "manner": [10, 14], "get_raw": 10, "push_decod": 10, "none": [10, 11, 13, 16, 17, 18], "instanc": [10, 13, 15, 16], "raw": 10, "instruct": [10, 11, 13, 15, 16, 17, 19, 20, 22, 23], "previou": [10, 14, 20], "fetchlayout": [10, 13], "send": [10, 13, 15, 16], "next": [10, 15, 16, 17, 20], "describ": [10, 15, 16, 20], "decodelayout": [10, 13, 15], "elementari": 10, "opcod": [10, 13, 23, 24], "funct3": [10, 11, 13], "etc": 10, "attribut": [10, 11, 12, 13, 14, 16, 17, 18], "gen": [10, 11, 12, 16], "ilen": [10, 13], "identifi": [10, 13, 23], "funct3_v": 10, "1": [10, 11, 12, 13, 15, 17, 18, 20, 23, 24], "funct7": [10, 11, 13], "seven": 10, "funct7_v": 10, "funct12": [10, 13], "twelv": 10, "funct12_v": 10, "rd": [10, 13], "reg_cnt_log": 10, "address": [10, 13, 14, 17, 19, 20], "regist": [10, 13, 15, 17, 20, 22], "rd_v": 10, "rs1": [10, 13], "hold": [10, 14, 17], "first": [10, 11, 15, 20, 23, 24], "input": [10, 11, 16, 17, 18, 20, 23, 24], "rs1_v": 10, "take": [10, 13, 14, 16, 22, 23, 25], "form": [10, 13, 17, 20], "rs2": [10, 13], "second": [10, 11, 15, 23, 24], "rs2_v": 10, "imm": [10, 13], "xlen": [10, 11, 13, 17], "immedi": [10, 14], "were": [10, 20], "succ": 10, "fencetarget": [10, 13], "successor": 10, "fenc": [10, 13], "pred": 10, "predecessor": 10, "fm": 10, "fencefm": [10, 13], "mode": [10, 13, 20], "csr_alen": [10, 13], "control": [10, 13, 14, 17], "sourc": [10, 15, 23], "kind": [10, 11, 13, 15], "illeg": 10, "wa": [10, 13, 17, 20], "success": [10, 14], "fit": 10, "pc": [10, 17, 19], "increment": [10, 17], "ilen_byt": 10, "icacheinterfac": 10, "cont": 10, "cach": [10, 13, 19], "unalignedfetch": 10, "unalign": 10, "associ": [10, 13], "replac": [10, 12, 13, 23], "polici": 10, "pseudo": 10, "random": 10, "scheme": 10, "time": [10, 14, 17, 20, 25], "trash": 10, "we": [10, 16, 20, 22, 23, 24, 25], "keep": 10, "global": [10, 17, 20], "counter": [10, 13, 17], "abstract": [10, 12, 13], "awai": 10, "refiller_start": 10, "whenev": 10, "refiller_accept": 10, "word": [10, 13], "written": [10, 17, 24], "last": [10, 15], "transfer": [10, 14], "over": [10, 17, 18], "shouldn": 10, "until": [10, 20], "start": [10, 11, 14, 20], "icachelayout": [10, 13], "icacheparamet": [10, 13], "cacherefillerinterfac": 10, "start_refil": 10, "accept_refil": 10, "deserialize_addr": 10, "raw_addr": 10, "dict": [10, 14, 18], "str": [10, 13, 18], "hdl": [10, 13], "ast": [10, 13], "serialize_addr": 10, "addr": 10, "icachebypass": 10, "wb_master": 10, "wishbonemast": [10, 13, 14], "haselabor": [10, 18], "kwarg": [10, 13, 14, 18], "simplewbcacherefil": 10, "instrdecompress": 10, "decompr_reg": 10, "rvc_reg": 10, "instr_mux": 10, "sel": 10, "int": [10, 11, 12, 13, 14, 16, 17, 18], "enum": [10, 11, 13, 18], "valuecast": [10, 13, 18], "tupl": [10, 11, 15, 16, 17, 18], "is_instr_compress": 10, "alucompon": [11, 13], "functionalcomponentparam": [11, 13, 16], "zba_en": 11, "fals": [11, 13, 18], "zbb_enabl": 11, "get_modul": [11, 13, 16, 17], "funcunit": [11, 13, 16, 18], "get_optyp": [11, 13, 16, 17], "alufuncunit": 11, "alu_fn": 11, "alufn": 11, "object": [11, 13, 14], "divcompon": 11, "ipc": 11, "div_fn": 11, "divfn": 11, "decodermanag": 11, "fn": 11, "intflag": [11, 13], "enumer": [11, 13, 17, 18], "div": [11, 13], "divu": [11, 13], "2": [11, 12, 13, 14, 17, 18], "rem": [11, 13], "remu": [11, 13], "8": [11, 12, 13, 14], "get_instruct": 11, "divunit": 11, "get_input": 11, "exceptionfuncunit": 11, "unit_fn": 11, "exceptionunitfn": 11, "exceptionunitcompon": [11, 13], "respons": [11, 14, 15], "decode_fn": 11, "exec_fn": 11, "op": [11, 13], "check_optyp": 11, "bool": [11, 13, 17, 18], "valid": [11, 13, 14, 15, 23], "get_decod": 11, "get_funct": 11, "get_op_typ": 11, "jumpbranchfuncunit": 11, "jb_fn": 11, "jumpbranchfn": 11, "jumpcompon": [11, 13], "mulcompon": 11, "mul_unit_typ": 11, "multyp": 11, "dsp_width": [11, 12], "mul_fn": 11, "mulfn": 11, "hot": [11, 18, 20], "wire": 11, "5": [11, 13, 22], "mul": [11, 13], "mulh": [11, 13], "mulhsu": [11, 13], "mulhu": [11, 13], "intenum": [11, 13, 17], "recursive_mul": 11, "fastest": 11, "multipli": [11, 12], "costli": [11, 20], "term": 11, "sequence_mul": 11, "dsp": [11, 12], "balanc": 11, "between": [11, 20], "cost": [11, 19], "shift_mul": 11, "cheapest": 11, "russian": [11, 12], "peasant": [11, 12], "algorithm": [11, 12], "mulunit": 11, "unsign": [11, 12], "integ": [11, 13, 18], "standard": [11, 17, 18, 20], "funcunitlayout": [11, 13, 15, 16], "comput": [11, 12, 17, 20], "mul_typ": 11, "shiftfuncunit": 11, "shift_unit_fn": 11, "shiftunitfn": 11, "shiftunitcompon": [11, 13], "clmultipli": 11, "carri": [11, 13, 25], "less": [11, 13], "product": 11, "i1": [11, 12], "n": [11, 12, 13], "factor": 11, "i2": [11, 12], "reset": [11, 17, 19], "new": [11, 13, 14, 18, 19, 20], "busi": 11, "while": 11, "progress": 11, "bit_width": 11, "recursion_depth": 11, "width": [11, 12, 13, 14, 17, 18], "depth": [11, 14, 18], "recurs": [11, 12, 18], "parallel": 11, "assum": [11, 16, 18, 20], "power": [11, 18], "iterative_modul": 11, "recursive_modul": 11, "zbccompon": 11, "zbc_fn": 11, "zbcfn": 11, "clmul": [11, 13], "clmulh": [11, 13], "clmulr": [11, 13], "classmethod": 11, "zbcunit": 11, "zbsfunction": 11, "in1": 11, "in2": 11, "zbscompon": 11, "bclr": [11, 13], "bext": [11, 13], "binv": [11, 13], "bset": [11, 13], "zbsunit": 11, "zbs_fn": 11, "dspmulunit": 12, "synthesi": [12, 19], "mulbaseunsign": 12, "unsignedmulunitlayout": [12, 13], "recursiveunsignedmul": 12, "fast": 12, "sequentialunsignedmul": 12, "sequenti": [12, 14], "classic": [12, 20], "shiftunsignedmul": 12, "cheap": 12, "multi": 12, "coreconfigur": 13, "func_units_config": 13, "blockcomponentparam": [13, 16, 17], "reserv": [13, 17, 19, 20], "station": [13, 19], "rsblockcompon": [13, 16], "rs_entri": [13, 16, 17], "lsublockcompon": 13, "compress": 13, "enabl": 13, "embed": 13, "reduc": [13, 20], "phys_regs_bit": 13, "physic": [13, 15, 20], "rob_entries_bit": 13, "reorder": [13, 20], "buffer": [13, 14, 20, 23], "start_pc": 13, "initi": [13, 19], "icache_en": 13, "disabl": 13, "bypass": 13, "icache_wai": 13, "icache_sets_bit": 13, "log": [13, 20], "icache_block_size_bit": 13, "allow_partial_extens": 13, "partial": 13, "_implied_extens": 13, "extenst": 13, "flag": 13, "specifi": [13, 14, 17, 24], "intern": [13, 18, 19], "abc": 13, "func_unit": [13, 16], "lsu": 13, "dummylsu": 13, "6": [13, 20], "7": 13, "dependencykei": 13, "u": [13, 20], "dependencymanag": [13, 17], "concret": 13, "frozen": 13, "lock_on_get": 13, "get_depend": 13, "empty_valid": 13, "without": [13, 15, 16, 20], "action": [13, 17], "caus": [13, 20], "rais": [13, 18, 20], "keyerror": 13, "add_depend": 13, "give": 13, "behavior": 13, "track": 13, "across": 13, "add": 13, "multpl": 13, "funcblock": [13, 15, 16, 17, 18], "get_rs_entry_count": [13, 16, 17], "optypes_support": 13, "iter": [13, 16, 17, 18], "dependentcach": 13, "cfg": 13, "addr_width": [13, 14], "length": [13, 18, 20], "word_width": 13, "machin": [13, 17], "num_of_wai": 13, "num_of_sets_bit": 13, "block_size_bit": 13, "btypeinstr": 13, "riscvinstr": 13, "pack": 13, "ebreakinstr": 13, "itypeinstr": 13, "illegalinstr": 13, "jtypeinstr": 13, "rtypeinstr": 13, "stypeinstr": 13, "utypeinstr": 13, "exceptioncaus": 13, "breakpoint": 13, "environment_call_from_m": 13, "environment_call_from_": 13, "9": 13, "environment_call_from_u": 13, "illegal_instruct": 13, "instruction_access_fault": 13, "instruction_address_misalign": 13, "instruction_page_fault": 13, "load_access_fault": 13, "load_address_misalign": 13, "load_page_fault": 13, "store_access_fault": 13, "store_address_misalign": 13, "store_page_fault": 13, "b": 13, "512": 13, "manipul": 13, "256": 13, "doubl": [13, 17, 20], "precis": [13, 20], "float": 13, "64": [13, 14], "98366": 13, "basic": [13, 19], "j": 13, "1024": 13, "dynam": [13, 18, 20], "decim": 13, "divis": 13, "16384": 13, "user": [13, 17, 20], "interrupt": [13, 19], "4096": 13, "simd": 13, "q": 13, "quad": 13, "2048": 13, "memori": [13, 14, 20], "8192": 13, "vector": [13, 15, 19, 20], "xintmachinemod": 13, "8589934592": 13, "categor": 13, "privilieg": 13, "xintsupervisor": 13, "17179869184": 13, "supervisor": [13, 17], "zam": 13, "2097152": 13, "misalign": 13, "zba": 13, "268435456": 13, "zbb": 13, "536870912": 13, "1073741824": 13, "2147483648": 13, "zdinx": 13, "33554432": 13, "zfh": 13, "4194304": 13, "half": 13, "zfhmin": 13, "8388608": 13, "minim": 13, "zfinx": 13, "16777216": 13, "zhinx": 13, "67108864": 13, "zicntr": 13, "524288": 13, "timer": [13, 17], "zicsr": 13, "32768": 13, "statu": [13, 17], "zifencei": 13, "65536": 13, "zihintntl": 13, "262144": 13, "non": [13, 23], "tempor": 13, "hint": 13, "zihintpaus": 13, "131072": 13, "paus": 13, "energi": 13, "zihpm": 13, "1048576": 13, "zmmul": 13, "134217728": 13, "ztso": 13, "4294967296": 13, "total": 13, "store": [13, 16, 18, 20, 23, 24], "tso": 13, "dev_i": 13, "dev_o": 13, "mem_r": 13, "mem_w": 13, "clz": 13, "1536": 13, "cpop": 13, "1538": 13, "ctz": 13, "1537": 13, "ebreak": 13, "ecal": 13, "mret": 13, "770": 13, "orcb": 13, "647": 13, "rev8_32": 13, "1688": 13, "rev8_64": 13, "1720": 13, "sextb": 13, "1540": 13, "sexth": 13, "1541": 13, "sret": 13, "258": 13, "wfi": 13, "261": 13, "zexth": 13, "AND": 13, "andn": 13, "beq": 13, "bge": 13, "bgeu": 13, "blt": 13, "bltu": 13, "bne": 13, "csrrc": 13, "csrrci": 13, "csrr": 13, "csrrsi": 13, "csrrw": 13, "csrrwi": 13, "divuw": 13, "divw": 13, "fencei": 13, "h": [13, 20], "hu": 13, "jalr": 13, "max": [13, 25], "maxu": 13, "min": 13, "minu": 13, "mulw": 13, "OR": 13, "orn": 13, "priv": 13, "remuw": 13, "remw": 13, "rev8": 13, "rol": 13, "ror": 13, "sh1add": 13, "sh2add": 13, "sh3add": 13, "sll": 13, "slt": 13, "sltu": 13, "sr": 13, "sub": 13, "w": [13, 20], "xnor": 13, "xor": 13, "36": 13, "52": 13, "20": 13, "48": 13, "muldiv": 13, "sa": 13, "sfencevma": 13, "sl": 13, "gather": 13, "numer": 13, "val": 13, "correspond": [13, 23], "val_log": 13, "field": [13, 16, 17, 18, 23, 24], "relev": 13, "nativ": 13, "reg_cnt": 13, "maximum": 13, "bitwis": 13, "isa_str": 13, "string": 13, "refer": 13, "gcc": 13, "detail": [13, 19], "instrtyp": 13, "auipc": 13, "branch": [13, 20, 25], "24": 13, "jal": 13, "27": 13, "25": 13, "load": [13, 20], "load_fp": 13, "lui": 13, "misc_mem": 13, "op32": 13, "op_imm": 13, "op_imm_32": 13, "store_fp": 13, "28": [13, 20], "a0": 13, "a1": 13, "a2": 13, "a3": 13, "a4": 13, "a5": 13, "a6": 13, "a7": 13, "17": 13, "fp": 13, "gp": [13, 17], "ra": 13, "s0": 13, "s1": 13, "s10": 13, "26": 13, "s11": 13, "s2": 13, "18": 13, "s3": 13, "19": 13, "s4": 13, "s5": 13, "21": 13, "s6": 13, "22": 13, "s7": 13, "23": 13, "s8": 13, "s9": 13, "sp": 13, "t0": 13, "t1": 13, "t2": 13, "t3": 13, "t4": 13, "29": 13, "t5": 13, "30": [13, 20], "t6": 13, "tp": 13, "x1": 13, "x10": 13, "x11": 13, "x12": 13, "x13": 13, "x14": 13, "x15": 13, "x16": 13, "x17": 13, "x18": 13, "x19": 13, "x2": 13, "x20": 13, "x21": 13, "x22": 13, "x23": 13, "x24": 13, "x25": 13, "x26": 13, "x27": 13, "x28": 13, "x29": 13, "x3": 13, "x30": 13, "x31": 13, "x4": 13, "x5": 13, "x6": 13, "x7": 13, "x8": 13, "x9": 13, "zero": [13, 23], "branchresolvedkei": 13, "unifierkei": [13, 16], "unifi": [13, 18], "alia": 13, "collector": 13, "exceptionreportkei": 13, "simplekei": 13, "genericcsrregisterskei": 13, "genericcsrregist": [13, 17], "instructionprecommitkei": 13, "methodtryproduct": 13, "wishbonedatakei": 13, "csrlayout": 13, "commonlayout": 13, "lsulayout": 13, "ratlayout": [13, 15], "rflayout": [13, 15], "roblayout": [13, 15], "rsinterfacelayout": 13, "rs_entries_bit": 13, "rslayout": [13, 15], "schedulerlayout": 13, "confus": 13, "address_gener": 13, "arithmet": 13, "bit_manipul": 13, "compar": [13, 19], "csr_imm": [13, 17], "csr_reg": [13, 17], "div_rem": 13, "33": 13, "logic": [13, 20, 24, 25], "single_bit_manipul": 13, "unary_bit_manipulation_1": 13, "unary_bit_manipulation_2": 13, "unary_bit_manipulation_3": 13, "unary_bit_manipulation_4": 13, "unary_bit_manipulation_5": 13, "optypes_required_by_extens": 13, "resolve_impl": 13, "ignore_unsupport": 13, "pipelinedwishbonemast": 14, "master": [14, 25], "wb_param": 14, "wishboneparamet": 14, "max_req": 14, "pend": 14, "wb": 14, "wishbonelayout": 14, "sent": [14, 16], "requestlayout": 14, "complet": [14, 16, 20], "resultlayout": 14, "requests_finish": 14, "generate_method_layout": 14, "wishbonearbit": 14, "arbit": 14, "slave": 14, "assert": 14, "cyc": 14, "grant": 14, "round": [14, 18], "robin": 14, "slave_wb": 14, "intefac": 14, "boolean": 14, "whether": [14, 18], "side": [14, 17, 20, 23, 24], "otherwis": 14, "wb_layout": 14, "wbmaster": 14, "becom": 14, "generate_layout": 14, "wishbonememoryslav": 14, "underneath": 14, "keyword": 14, "underli": 14, "infer": 14, "data_width": 14, "wishbonemux": 14, "muxer": 14, "master_wb": 14, "ssel_tga": 14, "corespond": 14, "tga": 14, "stb": 14, "note": [14, 17, 18], "stare": 14, "finish": [14, 16], "stall": [14, 17, 20], "clear": [14, 18, 23, 24], "delai": 14, "previous": 14, "deassert": 14, "dat_r": 14, "dat_w": 14, "adr": 14, "singal": 14, "granular": 14, "smallest": 14, "port": 14, "capabl": 14, "insert": [15, 16, 17, 18, 19, 20, 22, 23], "alloc": [15, 22, 23, 24], "renam": [15, 22], "entri": [15, 16, 18, 20, 22, 23, 24], "stuck": 15, "get_instr": 15, "get_free_reg": 15, "rat_renam": 15, "rob_put": 15, "rf_read1": 15, "rf_read2": 15, "reservation_st": 15, "decoded_instr": 15, "id": [15, 23, 24], "current": [15, 17, 20], "free": [15, 19, 20, 24], "rat_rename_in": 15, "rat_rename_out": 15, "data_layout": 15, "rf_read_out": 15, "rf_read_in": 15, "wakeupselect": 15, "wakeup": [15, 24], "firstli": 15, "get_readi": 15, "binari": 15, "where": [15, 20, 23, 24], "th": 15, "posit": [15, 23, 24], "row": [15, 19], "taken": 15, "take_row": 15, "get_ready_list_out": 15, "take_out": 15, "push": 15, "down": 15, "resultannounc": 16, "mark": [16, 19, 20], "get_result": [16, 17, 18], "serial": 16, "than": [16, 20], "manytooneconnecttran": 16, "rob_mark_don": 16, "rs_write_v": 16, "rf_write_v": 16, "end": [16, 20], "rob_id": 16, "reg_id": 16, "reg_val": 16, "funcblocksunifi": 16, "extra_methods_requir": 16, "get_extra_method": 16, "item": [16, 18], "rob_peek": 16, "rob_retir": 16, "r_rat_commit": 16, "free_rf_put": 16, "rf_free": 16, "exception_cause_get": 16, "rsfuncblock": 16, "With": 16, "csrblockcompon": 17, "csrlistkei": 17, "listkei": 17, "csrregist": 17, "behaviour": 17, "csrunit": 17, "csr_val": 17, "effect": [17, 20, 23, 24], "_fu_read": 17, "_fu_writ": 17, "simultan": 17, "ignor": 17, "prioriti": [17, 18], "csr_number": 17, "ro_bit": 17, "mask": 17, "those": [17, 20], "upper": 17, "0b11": 17, "discard": 17, "regitst": 17, "unitl": 17, "place": [17, 20, 23], "put": [17, 23], "receiv": 17, "fetch_continu": 17, "resum": 17, "privilegelevel": 17, "csr_access_privileg": 17, "csr_addr": 17, "csraddress": 17, "3072": 17, "cycleh": 17, "3200": 17, "instret": 17, "3074": 17, "instreth": 17, "3202": 17, "mcaus": 17, "834": 17, "3073": 17, "timeh": 17, "3201": 17, "doublecountercsr": 17, "group": 17, "At": 17, "overflow": 17, "low_addr": 17, "high_addr": 17, "repres": 17, "lower": [17, 18], "higher": 17, "synthetis": 17, "exceptioncauseregist": 17, "rob_get_indic": 17, "should_update_priorii": 17, "current_caus": 17, "new_caus": 17, "frat": 17, "rrat": 17, "registerfil": 17, "reorderbuff": 17, "ready_for": 17, "auto_debug_sign": 18, "union": 18, "view": 18, "signalbundl": 18, "map": [18, 19, 20], "arrai": 18, "basicfifo": 18, "empti": 18, "reiniti": 18, "init": 18, "shape": 18, "shapecast": 18, "rang": 18, "layoutlik": 18, "paramt": 18, "semaphor": 18, "max_count": 18, "assigntyp": 18, "rh": 18, "moduleconnector": 18, "anonym": 18, "onehotswitch": 18, "modulelik": 18, "switch": [18, 20, 23], "style": 18, "similar": [18, 20], "benefit": 18, "represent": 18, "sig": 18, "onehotcas": 18, "0b01": 18, "0b10": 18, "onehotswitchdynam": 18, "liter": 18, "variabl": 18, "signifi": 18, "align_to_power_of_two": 18, "num": 18, "up": [18, 19, 24], "lh": 18, "assignarg": 18, "assignfield": 18, "lhs_strict": 18, "rhs_strict": 18, "safe": [18, 20], "structlayout": 18, "mismatch": 18, "accord": 18, "explicitli": 18, "castabl": 18, "determin": [18, 20], "subrecord": 18, "valueerror": 18, "bits_from_int": 18, "count_leading_zero": 18, "count_trailing_zero": 18, "flatten_sign": 18, "flatten": 18, "popcount": 18, "silence_mustus": 18, "introduct": 19, "assumpt": [19, 20], "made": [19, 20], "develop": 19, "environ": 19, "script": [19, 25], "run_test": 19, "py": [19, 25], "lint": 19, "sh": 19, "core_graph": 19, "build_doc": 19, "framework": [19, 23], "usag": 19, "advanc": 19, "concept": 19, "nest": 19, "schema": 19, "proposit": [19, 20], "slot": 19, "tabl": 19, "substitut": 19, "clean": 19, "problem": [19, 20], "checklist": 19, "benchmark": 19, "summari": 19, "paper": 19, "about": 19, "old": 19, "softwar": 19, "tlb": 19, "analysi": 19, "strategi": 19, "igpu": 19, "specul": 19, "gpu": 19, "effici": 19, "journal": 20, "articl": 20, "look": 20, "choic": 20, "primari": 20, "relat": 20, "procedur": 20, "chosen": 20, "basi": 20, "improv": 20, "pretti": 20, "1993": 20, "2001": 20, "much": 20, "research": 20, "cpu": 20, "solv": 20, "due": 20, "characterist": 20, "our": [20, 22], "what": 20, "peopl": 20, "probabl": 20, "lot": 20, "worth": 20, "walker": 20, "cragon": 20, "concurr": 20, "ieee": 20, "vol": 20, "june": 20, "1995": 20, "moudgil": 20, "vassiliadi": 20, "micro": 20, "pp": 20, "58": 20, "67": 20, "februari": 20, "1996": 20, "survei": 20, "topic": 20, "cdc": 20, "6600": 20, "done": 20, "jump": 20, "handler": 20, "ibm360": 20, "stop": 20, "crai": 20, "here": [20, 23], "bigger": 20, "torng": 20, "martin": 20, "dai": 20, "probe": 20, "author": 20, "window": 20, "iw": 20, "dispatch": [20, 22, 23, 24], "didn": 20, "context": 20, "copi": 20, "restor": 20, "restart": 20, "few": 20, "encod": 20, "big": 20, "overhead": 20, "origin": 20, "unfeas": 20, "job": 20, "addition": 20, "But": 20, "cooper": 20, "smaller": 20, "interest": 20, "propos": 20, "nrp": 20, "No": 20, "itself": 20, "wast": 20, "how": [20, 23, 25], "mani": [20, 25], "element": 20, "left": 20, "middl": [20, 22], "aamer": 20, "jaleel": 20, "bruce": 20, "jacob": 20, "cours": 20, "penalti": 20, "alpha": 20, "mip": 20, "concentr": 20, "properti": 20, "short": 20, "inlin": 20, "observ": 20, "enough": 20, "live": 20, "known": 20, "fly": 20, "swap": 20, "nop": 20, "reexecut": 20, "indic": [20, 24], "privileg": 20, "correct": [20, 23, 24], "contrast": 20, "tendenc": 20, "longer": 20, "hard": 20, "risk": 20, "linux": [20, 25], "purpos": 20, "addit": 20, "hw": 20, "bore": 20, "treat": [20, 22], "mansur": 20, "samadzadeh": 20, "loai": 20, "garalnabi": 20, "checkpoint": 20, "repair": 20, "histori": 20, "futur": [20, 22, 23], "jaikrishnan": 20, "menon": 20, "marc": 20, "de": 20, "kruijf": 20, "karthikeyan": 20, "sankaralingam": 20, "2012": 20, "To": [20, 25], "low": 20, "boundari": 20, "rewritten": 20, "recompil": 20, "runtim": 20, "region": 20, "subregion": 20, "begin": 20, "small": 20, "overrid": 20, "barrier": 20, "warp": 20, "wrong": 20, "split": [20, 22], "prevent": 20, "ivan": 20, "tanas": 20, "isaac": 20, "gelado": 20, "jorda": 20, "eduard": 20, "ayguad": 20, "nacho": 20, "navarro": 20, "2017": 20, "analys": 20, "problemat": 20, "successfulli": 20, "kill": 20, "modif": 20, "fail": 20, "repli": 20, "modifi": 20, "claim": 20, "operand": [20, 23, 24], "replai": 20, "marker": 20, "jerom": 20, "hampton": 20, "2008": 20, "mention": 20, "alli": 20, "bailei": 20, "ab04": 20, "ag": 20, "younger": 20, "repeat": 20, "canon": 20, "eventu": 20, "aren": 20, "Its": 22, "task": 22, "rss": 22, "phase": 22, "choos": 22, "potenti": 22, "merg": 22, "optim": 22, "todo": 22, "want": 23, "feel": 23, "anyth": 23, "id_out": [23, 24], "id_rob": [23, 24], "id_rs1": [23, 24], "val_rs1": [23, 24], "id_rs2": [23, 24], "val_rs2": [23, 24], "fill": 23, "id_rsx": 23, "val_rsx": 23, "releas": 23, "comparison": 23, "null": [23, 24], "woken": 24, "invalid": 24, "src1": 24, "src2": 24, "inst_readi": 24, "synthes": 25, "circuit": 25, "consum": 25, "grow": 25, "yosi": 25, "prjtrelli": 25, "nextpnr": 25, "ecp5": 25, "manual": 25, "git": 25, "repositori": 25, "docker": 25, "imag": 25, "vuush": 25, "synth": 25, "amaranthsynthecp5": 25, "dockerfil": 25, "command": 25, "amd64": 25, "parse_benchmark_info": 25, "pars": 25, "extract": 25, "frequenc": 25, "cell": 25, "ram": 25, "dff": 25, "dedic": 25, "subpag": 25}, "objects": {"": [[9, 0, 0, "-", "coreblocks"]], "coreblocks": [[9, 0, 0, "-", "core"], [10, 0, 0, "-", "frontend"], [11, 0, 0, "-", "fu"], [13, 0, 0, "-", "params"], [14, 0, 0, "-", "peripherals"], [15, 0, 0, "-", "scheduler"], [16, 0, 0, "-", "stages"], [17, 0, 0, "-", "structs_common"], [18, 0, 0, "-", "utils"]], "coreblocks.core": [[9, 1, 1, "", "Core"]], "coreblocks.core.Core": [[9, 2, 1, "", "__init__"]], "coreblocks.frontend": [[10, 0, 0, "-", "decode"], [10, 0, 0, "-", "decoder"], [10, 0, 0, "-", "fetch"], [10, 0, 0, "-", "icache"], [10, 0, 0, "-", "rvc"]], "coreblocks.frontend.decode": [[10, 1, 1, "", "Decode"]], "coreblocks.frontend.decode.Decode": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.decoder": [[10, 1, 1, "", "InstrDecoder"]], "coreblocks.frontend.decoder.InstrDecoder": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.fetch": [[10, 1, 1, "", "Fetch"], [10, 1, 1, "", "UnalignedFetch"]], "coreblocks.frontend.fetch.Fetch": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.fetch.UnalignedFetch": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.icache": [[10, 1, 1, "", "ICache"], [10, 1, 1, "", "ICacheBypass"], [10, 1, 1, "", "ICacheInterface"], [10, 1, 1, "", "SimpleWBCacheRefiller"]], "coreblocks.frontend.icache.ICache": [[10, 2, 1, "", "__init__"], [10, 2, 1, "", "deserialize_addr"], [10, 2, 1, "", "serialize_addr"]], "coreblocks.frontend.icache.ICacheBypass": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.icache.ICacheInterface": [[10, 2, 1, "", "__init__"], [10, 3, 1, "", "accept_res"], [10, 3, 1, "", "flush"], [10, 3, 1, "", "issue_req"]], "coreblocks.frontend.icache.SimpleWBCacheRefiller": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.rvc": [[10, 1, 1, "", "InstrDecompress"], [10, 4, 1, "", "is_instr_compressed"]], "coreblocks.frontend.rvc.InstrDecompress": [[10, 2, 1, "", "__init__"], [10, 2, 1, "", "decompr_reg"], [10, 2, 1, "", "instr_mux"]], "coreblocks.fu": [[11, 0, 0, "-", "alu"], [11, 0, 0, "-", "div_unit"], [11, 0, 0, "-", "exception"], [11, 0, 0, "-", "fu_decoder"], [11, 0, 0, "-", "jumpbranch"], [11, 0, 0, "-", "mul_unit"], [11, 0, 0, "-", "shift_unit"], [12, 0, 0, "-", "unsigned_multiplication"], [11, 0, 0, "-", "zbc"], [11, 0, 0, "-", "zbs"]], "coreblocks.fu.alu": [[11, 1, 1, "", "ALUComponent"], [11, 1, 1, "", "AluFuncUnit"]], "coreblocks.fu.alu.ALUComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.alu.AluFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.div_unit": [[11, 1, 1, "", "DivComponent"], [11, 1, 1, "", "DivFn"], [11, 1, 1, "", "DivUnit"], [11, 4, 1, "", "get_input"]], "coreblocks.fu.div_unit.DivComponent": [[11, 2, 1, "", "__init__"], [11, 3, 1, "", "div_fn"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"], [11, 3, 1, "", "ipc"]], "coreblocks.fu.div_unit.DivFn": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.div_unit.DivFn.Fn": [[11, 3, 1, "", "DIV"], [11, 3, 1, "", "DIVU"], [11, 3, 1, "", "REM"], [11, 3, 1, "", "REMU"]], "coreblocks.fu.div_unit.DivUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.exception": [[11, 1, 1, "", "ExceptionFuncUnit"], [11, 1, 1, "", "ExceptionUnitComponent"]], "coreblocks.fu.exception.ExceptionFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.exception.ExceptionUnitComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.fu_decoder": [[11, 1, 1, "", "Decoder"], [11, 1, 1, "", "DecoderManager"]], "coreblocks.fu.fu_decoder.Decoder": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.fu_decoder.DecoderManager": [[11, 3, 1, "", "Fn"], [11, 2, 1, "", "get_decoder"], [11, 2, 1, "", "get_function"], [11, 2, 1, "", "get_instructions"], [11, 2, 1, "", "get_op_types"]], "coreblocks.fu.jumpbranch": [[11, 1, 1, "", "JumpBranchFuncUnit"], [11, 1, 1, "", "JumpComponent"]], "coreblocks.fu.jumpbranch.JumpBranchFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.jumpbranch.JumpComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.mul_unit": [[11, 1, 1, "", "MulComponent"], [11, 1, 1, "", "MulFn"], [11, 1, 1, "", "MulType"], [11, 1, 1, "", "MulUnit"]], "coreblocks.fu.mul_unit.MulComponent": [[11, 2, 1, "", "__init__"], [11, 3, 1, "", "dsp_width"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"], [11, 3, 1, "", "mul_fn"], [11, 3, 1, "", "mul_unit_type"]], "coreblocks.fu.mul_unit.MulFn": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.mul_unit.MulFn.Fn": [[11, 3, 1, "", "MUL"], [11, 3, 1, "", "MULH"], [11, 3, 1, "", "MULHSU"], [11, 3, 1, "", "MULHU"]], "coreblocks.fu.mul_unit.MulType": [[11, 3, 1, "", "RECURSIVE_MUL"], [11, 3, 1, "", "SEQUENCE_MUL"], [11, 3, 1, "", "SHIFT_MUL"]], "coreblocks.fu.mul_unit.MulUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.shift_unit": [[11, 1, 1, "", "ShiftFuncUnit"], [11, 1, 1, "", "ShiftUnitComponent"]], "coreblocks.fu.shift_unit.ShiftFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.shift_unit.ShiftUnitComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.unsigned_multiplication": [[12, 0, 0, "-", "common"], [12, 0, 0, "-", "fast_recursive"], [12, 0, 0, "-", "sequence"], [12, 0, 0, "-", "shift"]], "coreblocks.fu.unsigned_multiplication.common": [[12, 1, 1, "", "DSPMulUnit"], [12, 1, 1, "", "MulBaseUnsigned"]], "coreblocks.fu.unsigned_multiplication.common.DSPMulUnit": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.common.MulBaseUnsigned": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.fast_recursive": [[12, 1, 1, "", "RecursiveUnsignedMul"]], "coreblocks.fu.unsigned_multiplication.fast_recursive.RecursiveUnsignedMul": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.sequence": [[12, 1, 1, "", "SequentialUnsignedMul"]], "coreblocks.fu.unsigned_multiplication.sequence.SequentialUnsignedMul": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.shift": [[12, 1, 1, "", "ShiftUnsignedMul"]], "coreblocks.fu.unsigned_multiplication.shift.ShiftUnsignedMul": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.zbc": [[11, 1, 1, "", "ClMultiplier"], [11, 1, 1, "", "ZbcComponent"], [11, 1, 1, "", "ZbcFn"], [11, 1, 1, "", "ZbcUnit"]], "coreblocks.fu.zbc.ClMultiplier": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "iterative_module"], [11, 2, 1, "", "recursive_module"]], "coreblocks.fu.zbc.ZbcComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"], [11, 3, 1, "", "recursion_depth"], [11, 3, 1, "", "zbc_fn"]], "coreblocks.fu.zbc.ZbcFn": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.zbc.ZbcFn.Fn": [[11, 3, 1, "", "CLMUL"], [11, 3, 1, "", "CLMULH"], [11, 3, 1, "", "CLMULR"]], "coreblocks.fu.zbc.ZbcUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.zbs": [[11, 1, 1, "", "Zbs"], [11, 1, 1, "", "ZbsComponent"], [11, 1, 1, "", "ZbsFunction"], [11, 1, 1, "", "ZbsUnit"]], "coreblocks.fu.zbs.Zbs": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.zbs.ZbsComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.zbs.ZbsFunction": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.zbs.ZbsFunction.Fn": [[11, 3, 1, "", "BCLR"], [11, 3, 1, "", "BEXT"], [11, 3, 1, "", "BINV"], [11, 3, 1, "", "BSET"]], "coreblocks.fu.zbs.ZbsUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.params": [[13, 0, 0, "-", "configurations"], [13, 0, 0, "-", "dependencies"], [13, 0, 0, "-", "fu_params"], [13, 0, 0, "-", "genparams"], [13, 0, 0, "-", "icache_params"], [13, 0, 0, "-", "instr"], [13, 0, 0, "-", "isa"], [13, 0, 0, "-", "keys"], [13, 0, 0, "-", "layouts"], [13, 0, 0, "-", "optypes"]], "coreblocks.params.configurations": [[13, 1, 1, "", "CoreConfiguration"]], "coreblocks.params.configurations.CoreConfiguration": [[13, 2, 1, "", "__init__"], [13, 3, 1, "", "allow_partial_extensions"], [13, 3, 1, "", "compressed"], [13, 3, 1, "", "embedded"], [13, 3, 1, "", "func_units_config"], [13, 3, 1, "", "icache_block_size_bits"], [13, 3, 1, "", "icache_enable"], [13, 3, 1, "", "icache_sets_bits"], [13, 3, 1, "", "icache_ways"], [13, 3, 1, "", "phys_regs_bits"], [13, 2, 1, "", "replace"], [13, 3, 1, "", "rob_entries_bits"], [13, 3, 1, "", "start_pc"], [13, 3, 1, "", "xlen"]], "coreblocks.params.dependencies": [[13, 1, 1, "", "DependencyKey"], [13, 1, 1, "", "DependencyManager"]], "coreblocks.params.dependencies.DependencyKey": [[13, 2, 1, "", "combine"], [13, 3, 1, "", "empty_valid"], [13, 3, 1, "", "lock_on_get"]], "coreblocks.params.dependencies.DependencyManager": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "add_dependency"], [13, 2, 1, "", "get_dependency"]], "coreblocks.params.fu_params": [[13, 1, 1, "", "BlockComponentParams"], [13, 1, 1, "", "FunctionalComponentParams"], [13, 4, 1, "", "optypes_supported"]], "coreblocks.params.fu_params.BlockComponentParams": [[13, 2, 1, "", "get_module"], [13, 2, 1, "", "get_optypes"], [13, 2, 1, "", "get_rs_entry_count"]], "coreblocks.params.fu_params.FunctionalComponentParams": [[13, 2, 1, "", "get_module"], [13, 2, 1, "", "get_optypes"]], "coreblocks.params.genparams": [[13, 1, 1, "", "GenParams"]], "coreblocks.params.genparams.GenParams": [[13, 2, 1, "", "__init__"]], "coreblocks.params.icache_params": [[13, 1, 1, "", "ICacheParameters"]], "coreblocks.params.icache_params.ICacheParameters": [[13, 2, 1, "", "__init__"]], "coreblocks.params.instr": [[13, 1, 1, "", "BTypeInstr"], [13, 1, 1, "", "EBreakInstr"], [13, 1, 1, "", "ITypeInstr"], [13, 1, 1, "", "IllegalInstr"], [13, 1, 1, "", "JTypeInstr"], [13, 1, 1, "", "RTypeInstr"], [13, 1, 1, "", "STypeInstr"], [13, 1, 1, "", "UTypeInstr"]], "coreblocks.params.instr.BTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.EBreakInstr": [[13, 2, 1, "", "__init__"]], "coreblocks.params.instr.ITypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.IllegalInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.JTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.RTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.STypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.UTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.isa": [[13, 1, 1, "", "ExceptionCause"], [13, 1, 1, "", "Extension"], [13, 1, 1, "", "FenceFm"], [13, 1, 1, "", "FenceTarget"], [13, 1, 1, "", "Funct12"], [13, 1, 1, "", "Funct3"], [13, 1, 1, "", "Funct7"], [13, 1, 1, "", "ISA"], [13, 1, 1, "", "InstrType"], [13, 1, 1, "", "Opcode"], [13, 1, 1, "", "Registers"]], "coreblocks.params.isa.ExceptionCause": [[13, 3, 1, "", "BREAKPOINT"], [13, 3, 1, "", "ENVIRONMENT_CALL_FROM_M"], [13, 3, 1, "", "ENVIRONMENT_CALL_FROM_S"], [13, 3, 1, "", "ENVIRONMENT_CALL_FROM_U"], [13, 3, 1, "", "ILLEGAL_INSTRUCTION"], [13, 3, 1, "", "INSTRUCTION_ACCESS_FAULT"], [13, 3, 1, "", "INSTRUCTION_ADDRESS_MISALIGNED"], [13, 3, 1, "", "INSTRUCTION_PAGE_FAULT"], [13, 3, 1, "", "LOAD_ACCESS_FAULT"], [13, 3, 1, "", "LOAD_ADDRESS_MISALIGNED"], [13, 3, 1, "", "LOAD_PAGE_FAULT"], [13, 3, 1, "", "STORE_ACCESS_FAULT"], [13, 3, 1, "", "STORE_ADDRESS_MISALIGNED"], [13, 3, 1, "", "STORE_PAGE_FAULT"]], "coreblocks.params.isa.Extension": [[13, 3, 1, "", "A"], [13, 3, 1, "", "B"], [13, 3, 1, "", "C"], [13, 3, 1, "", "D"], [13, 3, 1, "", "E"], [13, 3, 1, "", "F"], [13, 3, 1, "", "G"], [13, 3, 1, "", "I"], [13, 3, 1, "", "J"], [13, 3, 1, "", "L"], [13, 3, 1, "", "M"], [13, 3, 1, "", "N"], [13, 3, 1, "", "P"], [13, 3, 1, "", "Q"], [13, 3, 1, "", "T"], [13, 3, 1, "", "V"], [13, 3, 1, "", "XINTMACHINEMODE"], [13, 3, 1, "", "XINTSUPERVISOR"], [13, 3, 1, "", "ZAM"], [13, 3, 1, "", "ZBA"], [13, 3, 1, "", "ZBB"], [13, 3, 1, "", "ZBC"], [13, 3, 1, "", "ZBS"], [13, 3, 1, "", "ZDINX"], [13, 3, 1, "", "ZFH"], [13, 3, 1, "", "ZFHMIN"], [13, 3, 1, "", "ZFINX"], [13, 3, 1, "", "ZHINX"], [13, 3, 1, "", "ZICNTR"], [13, 3, 1, "", "ZICSR"], [13, 3, 1, "", "ZIFENCEI"], [13, 3, 1, "", "ZIHINTNTL"], [13, 3, 1, "", "ZIHINTPAUSE"], [13, 3, 1, "", "ZIHPM"], [13, 3, 1, "", "ZMMUL"], [13, 3, 1, "", "ZTSO"]], "coreblocks.params.isa.FenceFm": [[13, 3, 1, "", "NONE"], [13, 3, 1, "", "TSO"]], "coreblocks.params.isa.FenceTarget": [[13, 3, 1, "", "DEV_I"], [13, 3, 1, "", "DEV_O"], [13, 3, 1, "", "MEM_R"], [13, 3, 1, "", "MEM_W"]], "coreblocks.params.isa.Funct12": [[13, 3, 1, "", "CLZ"], [13, 3, 1, "", "CPOP"], [13, 3, 1, "", "CTZ"], [13, 3, 1, "", "EBREAK"], [13, 3, 1, "", "ECALL"], [13, 3, 1, "", "MRET"], [13, 3, 1, "", "ORCB"], [13, 3, 1, "", "REV8_32"], [13, 3, 1, "", "REV8_64"], [13, 3, 1, "", "SEXTB"], [13, 3, 1, "", "SEXTH"], [13, 3, 1, "", "SRET"], [13, 3, 1, "", "WFI"], [13, 3, 1, "", "ZEXTH"]], "coreblocks.params.isa.Funct3": [[13, 3, 1, "", "ADD"], [13, 3, 1, "", "AND"], [13, 3, 1, "", "ANDN"], [13, 3, 1, "", "B"], [13, 3, 1, "", "BCLR"], [13, 3, 1, "", "BEQ"], [13, 3, 1, "", "BEXT"], [13, 3, 1, "", "BGE"], [13, 3, 1, "", "BGEU"], [13, 3, 1, "", "BINV"], [13, 3, 1, "", "BLT"], [13, 3, 1, "", "BLTU"], [13, 3, 1, "", "BNE"], [13, 3, 1, "", "BSET"], [13, 3, 1, "", "BU"], [13, 3, 1, "", "CLMUL"], [13, 3, 1, "", "CLMULH"], [13, 3, 1, "", "CLMULR"], [13, 3, 1, "", "CLZ"], [13, 3, 1, "", "CPOP"], [13, 3, 1, "", "CSRRC"], [13, 3, 1, "", "CSRRCI"], [13, 3, 1, "", "CSRRS"], [13, 3, 1, "", "CSRRSI"], [13, 3, 1, "", "CSRRW"], [13, 3, 1, "", "CSRRWI"], [13, 3, 1, "", "CTZ"], [13, 3, 1, "", "D"], [13, 3, 1, "", "DIV"], [13, 3, 1, "", "DIVU"], [13, 3, 1, "", "DIVUW"], [13, 3, 1, "", "DIVW"], [13, 3, 1, "", "FENCE"], [13, 3, 1, "", "FENCEI"], [13, 3, 1, "", "H"], [13, 3, 1, "", "HU"], [13, 3, 1, "", "JALR"], [13, 3, 1, "", "MAX"], [13, 3, 1, "", "MAXU"], [13, 3, 1, "", "MIN"], [13, 3, 1, "", "MINU"], [13, 3, 1, "", "MUL"], [13, 3, 1, "", "MULH"], [13, 3, 1, "", "MULHSU"], [13, 3, 1, "", "MULHU"], [13, 3, 1, "", "MULW"], [13, 3, 1, "", "OR"], [13, 3, 1, "", "ORCB"], [13, 3, 1, "", "ORN"], [13, 3, 1, "", "PRIV"], [13, 3, 1, "", "REM"], [13, 3, 1, "", "REMU"], [13, 3, 1, "", "REMUW"], [13, 3, 1, "", "REMW"], [13, 3, 1, "", "REV8"], [13, 3, 1, "", "ROL"], [13, 3, 1, "", "ROR"], [13, 3, 1, "", "SEXTB"], [13, 3, 1, "", "SEXTH"], [13, 3, 1, "", "SH1ADD"], [13, 3, 1, "", "SH2ADD"], [13, 3, 1, "", "SH3ADD"], [13, 3, 1, "", "SLL"], [13, 3, 1, "", "SLT"], [13, 3, 1, "", "SLTU"], [13, 3, 1, "", "SR"], [13, 3, 1, "", "SUB"], [13, 3, 1, "", "W"], [13, 3, 1, "", "XNOR"], [13, 3, 1, "", "XOR"], [13, 3, 1, "", "ZEXTH"]], "coreblocks.params.isa.Funct7": [[13, 3, 1, "", "ADD"], [13, 3, 1, "", "AND"], [13, 3, 1, "", "ANDN"], [13, 3, 1, "", "BCLR"], [13, 3, 1, "", "BEXT"], [13, 3, 1, "", "BINV"], [13, 3, 1, "", "BSET"], [13, 3, 1, "", "CLMUL"], [13, 3, 1, "", "CLZ"], [13, 3, 1, "", "CPOP"], [13, 3, 1, "", "CTZ"], [13, 3, 1, "", "MAX"], [13, 3, 1, "", "MIN"], [13, 3, 1, "", "MULDIV"], [13, 3, 1, "", "OR"], [13, 3, 1, "", "ORCB"], [13, 3, 1, "", "ORN"], [13, 3, 1, "", "REV8"], [13, 3, 1, "", "ROL"], [13, 3, 1, "", "ROR"], [13, 3, 1, "", "SA"], [13, 3, 1, "", "SEXTB"], [13, 3, 1, "", "SEXTH"], [13, 3, 1, "", "SFENCEVMA"], [13, 3, 1, "", "SH1ADD"], [13, 3, 1, "", "SH2ADD"], [13, 3, 1, "", "SH3ADD"], [13, 3, 1, "", "SL"], [13, 3, 1, "", "SLT"], [13, 3, 1, "", "SUB"], [13, 3, 1, "", "XNOR"], [13, 3, 1, "", "XOR"], [13, 3, 1, "", "ZEXTH"]], "coreblocks.params.isa.ISA": [[13, 2, 1, "", "__init__"]], "coreblocks.params.isa.InstrType": [[13, 3, 1, "", "B"], [13, 3, 1, "", "I"], [13, 3, 1, "", "J"], [13, 3, 1, "", "R"], [13, 3, 1, "", "S"], [13, 3, 1, "", "U"]], "coreblocks.params.isa.Opcode": [[13, 3, 1, "", "AUIPC"], [13, 3, 1, "", "BRANCH"], [13, 3, 1, "", "JAL"], [13, 3, 1, "", "JALR"], [13, 3, 1, "", "LOAD"], [13, 3, 1, "", "LOAD_FP"], [13, 3, 1, "", "LUI"], [13, 3, 1, "", "MISC_MEM"], [13, 3, 1, "", "OP"], [13, 3, 1, "", "OP32"], [13, 3, 1, "", "OP_IMM"], [13, 3, 1, "", "OP_IMM_32"], [13, 3, 1, "", "STORE"], [13, 3, 1, "", "STORE_FP"], [13, 3, 1, "", "SYSTEM"]], "coreblocks.params.isa.Registers": [[13, 3, 1, "", "A0"], [13, 3, 1, "", "A1"], [13, 3, 1, "", "A2"], [13, 3, 1, "", "A3"], [13, 3, 1, "", "A4"], [13, 3, 1, "", "A5"], [13, 3, 1, "", "A6"], [13, 3, 1, "", "A7"], [13, 3, 1, "", "FP"], [13, 3, 1, "", "GP"], [13, 3, 1, "", "RA"], [13, 3, 1, "", "S0"], [13, 3, 1, "", "S1"], [13, 3, 1, "", "S10"], [13, 3, 1, "", "S11"], [13, 3, 1, "", "S2"], [13, 3, 1, "", "S3"], [13, 3, 1, "", "S4"], [13, 3, 1, "", "S5"], [13, 3, 1, "", "S6"], [13, 3, 1, "", "S7"], [13, 3, 1, "", "S8"], [13, 3, 1, "", "S9"], [13, 3, 1, "", "SP"], [13, 3, 1, "", "T0"], [13, 3, 1, "", "T1"], [13, 3, 1, "", "T2"], [13, 3, 1, "", "T3"], [13, 3, 1, "", "T4"], [13, 3, 1, "", "T5"], [13, 3, 1, "", "T6"], [13, 3, 1, "", "TP"], [13, 3, 1, "", "X0"], [13, 3, 1, "", "X1"], [13, 3, 1, "", "X10"], [13, 3, 1, "", "X11"], [13, 3, 1, "", "X12"], [13, 3, 1, "", "X13"], [13, 3, 1, "", "X14"], [13, 3, 1, "", "X15"], [13, 3, 1, "", "X16"], [13, 3, 1, "", "X17"], [13, 3, 1, "", "X18"], [13, 3, 1, "", "X19"], [13, 3, 1, "", "X2"], [13, 3, 1, "", "X20"], [13, 3, 1, "", "X21"], [13, 3, 1, "", "X22"], [13, 3, 1, "", "X23"], [13, 3, 1, "", "X24"], [13, 3, 1, "", "X25"], [13, 3, 1, "", "X26"], [13, 3, 1, "", "X27"], [13, 3, 1, "", "X28"], [13, 3, 1, "", "X29"], [13, 3, 1, "", "X3"], [13, 3, 1, "", "X30"], [13, 3, 1, "", "X31"], [13, 3, 1, "", "X4"], [13, 3, 1, "", "X5"], [13, 3, 1, "", "X6"], [13, 3, 1, "", "X7"], [13, 3, 1, "", "X8"], [13, 3, 1, "", "X9"], [13, 3, 1, "", "ZERO"]], "coreblocks.params.keys": [[13, 1, 1, "", "BranchResolvedKey"], [13, 1, 1, "", "ExceptionReportKey"], [13, 1, 1, "", "GenericCSRRegistersKey"], [13, 1, 1, "", "InstructionPrecommitKey"], [13, 1, 1, "", "WishboneDataKey"]], "coreblocks.params.keys.BranchResolvedKey": [[13, 2, 1, "", "__init__"], [13, 3, 1, "", "unifier"]], "coreblocks.params.keys.ExceptionReportKey": [[13, 2, 1, "", "__init__"]], "coreblocks.params.keys.GenericCSRRegistersKey": [[13, 2, 1, "", "__init__"]], "coreblocks.params.keys.InstructionPrecommitKey": [[13, 2, 1, "", "__init__"], [13, 3, 1, "", "unifier"]], "coreblocks.params.keys.WishboneDataKey": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts": [[13, 1, 1, "", "CSRLayouts"], [13, 1, 1, "", "CommonLayouts"], [13, 1, 1, "", "DecodeLayouts"], [13, 1, 1, "", "FetchLayouts"], [13, 1, 1, "", "FuncUnitLayouts"], [13, 1, 1, "", "ICacheLayouts"], [13, 1, 1, "", "LSULayouts"], [13, 1, 1, "", "RATLayouts"], [13, 1, 1, "", "RFLayouts"], [13, 1, 1, "", "ROBLayouts"], [13, 1, 1, "", "RSInterfaceLayouts"], [13, 1, 1, "", "RSLayouts"], [13, 1, 1, "", "SchedulerLayouts"], [13, 1, 1, "", "UnsignedMulUnitLayouts"]], "coreblocks.params.layouts.CSRLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.CommonLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.DecodeLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.FetchLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.FuncUnitLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.ICacheLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.LSULayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RATLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RFLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.ROBLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RSInterfaceLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RSLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.SchedulerLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.UnsignedMulUnitLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.optypes": [[13, 1, 1, "", "OpType"], [13, 4, 1, "", "optypes_required_by_extensions"]], "coreblocks.params.optypes.OpType": [[13, 3, 1, "", "ADDRESS_GENERATION"], [13, 3, 1, "", "ARITHMETIC"], [13, 3, 1, "", "AUIPC"], [13, 3, 1, "", "BIT_MANIPULATION"], [13, 3, 1, "", "BRANCH"], [13, 3, 1, "", "CLMUL"], [13, 3, 1, "", "COMPARE"], [13, 3, 1, "", "CSR_IMM"], [13, 3, 1, "", "CSR_REG"], [13, 3, 1, "", "DIV_REM"], [13, 3, 1, "", "EBREAK"], [13, 3, 1, "", "ECALL"], [13, 3, 1, "", "EXCEPTION"], [13, 3, 1, "", "FENCE"], [13, 3, 1, "", "FENCEI"], [13, 3, 1, "", "JAL"], [13, 3, 1, "", "JALR"], [13, 3, 1, "", "LOAD"], [13, 3, 1, "", "LOGIC"], [13, 3, 1, "", "MRET"], [13, 3, 1, "", "MUL"], [13, 3, 1, "", "SFENCEVMA"], [13, 3, 1, "", "SHIFT"], [13, 3, 1, "", "SINGLE_BIT_MANIPULATION"], [13, 3, 1, "", "SRET"], [13, 3, 1, "", "STORE"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_1"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_2"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_3"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_4"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_5"], [13, 3, 1, "", "UNKNOWN"], [13, 3, 1, "", "WFI"]], "coreblocks.peripherals": [[14, 0, 0, "-", "wishbone"]], "coreblocks.peripherals.wishbone": [[14, 1, 1, "", "PipelinedWishboneMaster"], [14, 1, 1, "", "WishboneArbiter"], [14, 1, 1, "", "WishboneBus"], [14, 1, 1, "", "WishboneLayout"], [14, 1, 1, "", "WishboneMaster"], [14, 1, 1, "", "WishboneMemorySlave"], [14, 1, 1, "", "WishboneMuxer"], [14, 1, 1, "", "WishboneParameters"]], "coreblocks.peripherals.wishbone.PipelinedWishboneMaster": [[14, 2, 1, "", "__init__"], [14, 2, 1, "", "generate_method_layouts"]], "coreblocks.peripherals.wishbone.WishboneArbiter": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneBus": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneLayout": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneMaster": [[14, 2, 1, "", "__init__"], [14, 2, 1, "", "generate_layouts"]], "coreblocks.peripherals.wishbone.WishboneMemorySlave": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneMuxer": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneParameters": [[14, 2, 1, "", "__init__"]], "coreblocks.scheduler": [[15, 0, 0, "-", "scheduler"], [15, 0, 0, "-", "wakeup_select"]], "coreblocks.scheduler.scheduler": [[15, 1, 1, "", "Scheduler"]], "coreblocks.scheduler.scheduler.Scheduler": [[15, 2, 1, "", "__init__"]], "coreblocks.scheduler.wakeup_select": [[15, 1, 1, "", "WakeupSelect"]], "coreblocks.scheduler.wakeup_select.WakeupSelect": [[15, 2, 1, "", "__init__"]], "coreblocks.stages": [[16, 0, 0, "-", "backend"], [16, 0, 0, "-", "func_blocks_unifier"], [16, 0, 0, "-", "retirement"], [16, 0, 0, "-", "rs_func_block"]], "coreblocks.stages.backend": [[16, 1, 1, "", "ResultAnnouncement"]], "coreblocks.stages.backend.ResultAnnouncement": [[16, 2, 1, "", "__init__"], [16, 2, 1, "", "debug_signals"]], "coreblocks.stages.func_blocks_unifier": [[16, 1, 1, "", "FuncBlocksUnifier"]], "coreblocks.stages.func_blocks_unifier.FuncBlocksUnifier": [[16, 2, 1, "", "__init__"], [16, 2, 1, "", "get_extra_method"]], "coreblocks.stages.retirement": [[16, 1, 1, "", "Retirement"]], "coreblocks.stages.retirement.Retirement": [[16, 2, 1, "", "__init__"]], "coreblocks.stages.rs_func_block": [[16, 1, 1, "", "RSBlockComponent"], [16, 1, 1, "", "RSFuncBlock"]], "coreblocks.stages.rs_func_block.RSBlockComponent": [[16, 2, 1, "", "__init__"], [16, 3, 1, "", "func_units"], [16, 2, 1, "", "get_module"], [16, 2, 1, "", "get_optypes"], [16, 2, 1, "", "get_rs_entry_count"], [16, 3, 1, "", "rs_entries"]], "coreblocks.stages.rs_func_block.RSFuncBlock": [[16, 2, 1, "", "__init__"]], "coreblocks.structs_common": [[17, 0, 0, "-", "csr"], [17, 0, 0, "-", "csr_generic"], [17, 0, 0, "-", "exception"], [17, 0, 0, "-", "rat"], [17, 0, 0, "-", "rf"], [17, 0, 0, "-", "rob"], [17, 0, 0, "-", "rs"]], "coreblocks.structs_common.csr": [[17, 1, 1, "", "CSRBlockComponent"], [17, 1, 1, "", "CSRListKey"], [17, 1, 1, "", "CSRRegister"], [17, 1, 1, "", "CSRUnit"], [17, 1, 1, "", "PrivilegeLevel"], [17, 4, 1, "", "csr_access_privilege"]], "coreblocks.structs_common.csr.CSRBlockComponent": [[17, 2, 1, "", "get_module"], [17, 2, 1, "", "get_optypes"], [17, 2, 1, "", "get_rs_entry_count"]], "coreblocks.structs_common.csr.CSRListKey": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr.CSRRegister": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr.CSRUnit": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr.PrivilegeLevel": [[17, 3, 1, "", "MACHINE"], [17, 3, 1, "", "SUPERVISOR"], [17, 3, 1, "", "USER"]], "coreblocks.structs_common.csr_generic": [[17, 1, 1, "", "CSRAddress"], [17, 1, 1, "", "DoubleCounterCSR"], [17, 1, 1, "", "GenericCSRRegisters"]], "coreblocks.structs_common.csr_generic.CSRAddress": [[17, 3, 1, "", "CYCLE"], [17, 3, 1, "", "CYCLEH"], [17, 3, 1, "", "INSTRET"], [17, 3, 1, "", "INSTRETH"], [17, 3, 1, "", "MCAUSE"], [17, 3, 1, "", "TIME"], [17, 3, 1, "", "TIMEH"]], "coreblocks.structs_common.csr_generic.DoubleCounterCSR": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr_generic.GenericCSRRegisters": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.exception": [[17, 1, 1, "", "ExceptionCauseRegister"], [17, 4, 1, "", "should_update_prioriy"]], "coreblocks.structs_common.exception.ExceptionCauseRegister": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rat": [[17, 1, 1, "", "FRAT"], [17, 1, 1, "", "RRAT"]], "coreblocks.structs_common.rat.FRAT": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rat.RRAT": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rf": [[17, 1, 1, "", "RegisterFile"]], "coreblocks.structs_common.rf.RegisterFile": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rob": [[17, 1, 1, "", "ReorderBuffer"]], "coreblocks.structs_common.rob.ReorderBuffer": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rs": [[17, 1, 1, "", "RS"]], "coreblocks.structs_common.rs.RS": [[17, 2, 1, "", "__init__"]], "coreblocks.utils": [[18, 0, 0, "-", "debug_signals"], [18, 0, 0, "-", "fifo"], [18, 0, 0, "-", "protocols"], [18, 0, 0, "-", "utils"]], "coreblocks.utils.debug_signals": [[18, 4, 1, "", "auto_debug_signals"]], "coreblocks.utils.fifo": [[18, 1, 1, "", "BasicFifo"], [18, 1, 1, "", "Semaphore"]], "coreblocks.utils.fifo.BasicFifo": [[18, 2, 1, "", "__init__"]], "coreblocks.utils.fifo.Semaphore": [[18, 2, 1, "", "__init__"]], "coreblocks.utils.protocols": [[18, 1, 1, "", "FuncBlock"], [18, 1, 1, "", "FuncUnit"], [18, 1, 1, "", "Unifier"]], "coreblocks.utils.protocols.FuncBlock": [[18, 2, 1, "", "__init__"], [18, 3, 1, "", "get_result"], [18, 3, 1, "", "insert"], [18, 3, 1, "", "select"], [18, 3, 1, "", "update"]], "coreblocks.utils.protocols.FuncUnit": [[18, 2, 1, "", "__init__"], [18, 3, 1, "", "accept"], [18, 3, 1, "", "issue"]], "coreblocks.utils.protocols.Unifier": [[18, 2, 1, "", "__init__"], [18, 3, 1, "", "method"]], "coreblocks.utils.utils": [[18, 1, 1, "", "AssignType"], [18, 1, 1, "", "ModuleConnector"], [18, 4, 1, "", "OneHotSwitch"], [18, 4, 1, "", "OneHotSwitchDynamic"], [18, 4, 1, "", "align_to_power_of_two"], [18, 4, 1, "", "assign"], [18, 4, 1, "", "bits_from_int"], [18, 4, 1, "", "count_leading_zeros"], [18, 4, 1, "", "count_trailing_zeros"], [18, 4, 1, "", "flatten_signals"], [18, 4, 1, "", "popcount"], [18, 4, 1, "", "silence_mustuse"]], "coreblocks.utils.utils.AssignType": [[18, 3, 1, "", "ALL"], [18, 3, 1, "", "COMMON"], [18, 3, 1, "", "RHS"]], "coreblocks.utils.utils.ModuleConnector": [[18, 2, 1, "", "__init__"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"]}, "titleterms": {"list": 0, "assumpt": [0, 8], "made": 0, "dure": 0, "develop": [0, 2], "full": 1, "transact": [1, 5], "method": [1, 5, 23, 24], "graph": 1, "environ": 2, "set": 2, "up": 2, "us": [2, 23, 24], "script": 2, "run_test": 2, "py": 2, "lint": 2, "sh": 2, "core_graph": 2, "build_doc": 2, "introduct": [3, 5, 20], "document": [3, 5, 25], "problem": 4, "checklist": 4, "coreblock": [5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "framework": 5, "basic": 5, "usag": [5, 25], "implement": [5, 23], "The": 5, "librari": 5, "advanc": 5, "concept": 5, "nest": 5, "api": 6, "instruct": [8, 24], "cach": 8, "interfac": [8, 23, 24], "address": 8, "map": 8, "exampl": 8, "packag": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "subpackag": [9, 11], "submodul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "core": 9, "modul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "content": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "frontend": 10, "decod": 10, "fetch": 10, "icach": 10, "rvc": 10, "fu": [11, 12], "alu": 11, "div_unit": 11, "except": [11, 17, 20], "fu_decod": 11, "jumpbranch": 11, "mul_unit": 11, "shift_unit": 11, "zbc": 11, "zb": 11, "unsigned_multipl": 12, "common": 12, "fast_recurs": 12, "sequenc": 12, "shift": 12, "param": 13, "configur": 13, "depend": 13, "fu_param": 13, "genparam": 13, "icache_param": 13, "instr": 13, "isa": 13, "kei": 13, "layout": 13, "optyp": 13, "peripher": 14, "wishbon": 14, "schedul": [15, 22], "wakeup_select": 15, "stage": 16, "backend": 16, "func_blocks_unifi": 16, "retir": 16, "rs_func_block": 16, "structs_common": 17, "csr": 17, "csr_gener": 17, "rat": 17, "rf": 17, "rob": 17, "r": 17, "util": 18, "debug_sign": 18, "fifo": 18, "protocol": 18, "summari": 20, "paper": 20, "about": 20, "interrupt": 20, "handl": 20, "old": 20, "pc": 20, "out": 20, "order": 20, "execut": 20, "processor": 20, "In": 20, "line": 20, "softwar": 20, "manag": 20, "tlb": 20, "hardwar": 20, "cost": 20, "analysi": 20, "process": 20, "strategi": 20, "igpu": 20, "support": 20, "specul": 20, "gpu": 20, "effici": 20, "other": 20, "overview": [22, 24], "descript": 22, "schema": 22, "structur": 22, "more": 22, "detail": 22, "each": 22, "block": 22, "proposit": 23, "reserv": [23, 24], "station": [23, 24], "intern": 23, "data": 23, "actual": 23, "slot": [23, 24], "tabl": 23, "compar": [23, 24], "substitut": [23, 24], "read": [23, 24], "row": [23, 24], "clean": [23, 24], "get": [23, 24], "free": 23, "mark": [23, 24], "extern": [23, 24], "all": [23, 24], "reset": 24, "initi": 24, "state": 24, "insert": 24, "new": 24, "readi": 24, "vector": 24, "signal": 24, "synthesi": 25, "requir": 25, "benchmark": 25}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["Assumptions", "Current_graph", "Development_environment", "Home", "Problem-checklist", "Transactions", "api", "auto_graph", "components/icache", "coreblocks", "coreblocks.frontend", "coreblocks.fu", "coreblocks.fu.unsigned_multiplication", "coreblocks.params", "coreblocks.peripherals", "coreblocks.scheduler", "coreblocks.stages", "coreblocks.structs_common", "coreblocks.utils", "index", "miscellany/exceptionsSummary", "modules-coreblocks", "modules-transactron", "scheduler/Overview", "shared_structs/Implementation/RS_impl", "shared_structs/RS", "synthesis/Synthesis", "transactron"], "filenames": ["Assumptions.md", "Current_graph.md", "Development_environment.md", "Home.md", "Problem-checklist.md", "Transactions.md", "api.md", "auto_graph.rst", "components/icache.md", "coreblocks.rst", "coreblocks.frontend.rst", "coreblocks.fu.rst", "coreblocks.fu.unsigned_multiplication.rst", "coreblocks.params.rst", "coreblocks.peripherals.rst", "coreblocks.scheduler.rst", "coreblocks.stages.rst", "coreblocks.structs_common.rst", "coreblocks.utils.rst", "index.md", "miscellany/exceptionsSummary.md", "modules-coreblocks.rst", "modules-transactron.rst", "scheduler/Overview.md", "shared_structs/Implementation/RS_impl.md", "shared_structs/RS.md", "synthesis/Synthesis.md", "transactron.rst"], "titles": ["List of assumptions made during development", "Full transaction-method graph", "Development environment", "Introduction", "Problem checklist", "Documentation for Coreblocks transaction framework", "API", "<no title>", "Instruction Cache", "coreblocks package", "coreblocks.frontend package", "coreblocks.fu package", "coreblocks.fu.unsigned_multiplication package", "coreblocks.params package", "coreblocks.peripherals package", "coreblocks.scheduler package", "coreblocks.stages package", "coreblocks.structs_common package", "coreblocks.utils package", "Coreblocks", "Summary of papers about interrupts", "coreblocks", "transactron", "Scheduler overview", "Proposition of Reservation Station implementation", "Reservation Station", "Synthesis", "transactron package"], "terms": {"rf": [0, 6, 9, 16, 20, 21, 24, 25], "ha": [0, 2, 4, 10, 15, 17, 18, 20, 24, 27], "data": [0, 10, 13, 14, 17, 18, 19, 25, 27], "forward": [0, 27], "from": [0, 2, 3, 4, 5, 10, 13, 14, 15, 16, 17, 18, 20, 24, 25, 26, 27], "tomasulo": 0, "announc": [0, 16, 17], "bu": [0, 13, 14], "read": [0, 4, 5, 13, 14, 17, 18, 19, 27], "x0": [0, 13], "rf0": 0, "return": [0, 5, 8, 11, 13, 14, 18, 20, 27], "0": [0, 10, 11, 13, 15, 17, 24, 25, 27], "write": [0, 5, 10, 17, 18, 20, 25, 27], "i": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 23, 24, 25, 26, 27], "noop": 0, "separ": [0, 23, 27], "r": [0, 2, 6, 9, 13, 15, 16, 20, 21, 23, 24, 25], "each": [0, 10, 11, 13, 14, 17, 19, 20, 24, 25, 26, 27], "fu": [0, 6, 9, 13, 16, 17, 21, 24, 25], "writeback": 0, "stage": [0, 6, 9, 17, 21], "save": [0, 2, 13, 16, 20, 24, 25, 26, 27], "rob": [0, 6, 9, 15, 16, 20, 21, 23, 24, 25], "after": [0, 5, 8, 10, 14, 20, 23, 27], "get": [0, 2, 10, 11, 12, 13, 15, 16, 18, 19, 27], "output": [0, 2, 10, 14, 16, 17, 20, 24, 25, 26, 27], "commit": [0, 2, 17, 20, 26], "updat": [0, 16, 17, 18], "rat": [0, 6, 9, 15, 20, 21], "In": [2, 3, 5, 15, 18, 19, 25, 26, 27], "order": [2, 3, 5, 8, 13, 15, 19, 26, 27], "prepar": [2, 15, 20, 27], "pleas": [2, 4, 5, 13], "follow": [2, 5, 8, 11, 15, 18, 24, 26], "step": [2, 5, 10, 15, 20], "below": 2, "instal": [2, 26], "python": [2, 5, 18, 27], "3": [2, 11, 13, 17, 18, 27], "10": [2, 8, 13, 20], "interpret": [2, 13, 27], "pip": 2, "packag": [2, 6, 19, 21, 22], "manag": [2, 11, 13, 19, 27], "option": [2, 5, 11, 13, 17, 18, 27], "creat": [2, 10, 12, 18, 27], "virtual": 2, "python3": 2, "m": [2, 5, 13, 17, 18, 20, 27], "venv": 2, "project": [2, 3, 20, 26], "directori": [2, 3], "activ": [2, 27], "gener": [2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 26, 27], "bin": 2, "all": [2, 4, 5, 13, 14, 17, 18, 19, 20, 26, 27], "requir": [2, 8, 17, 19, 20, 27], "librari": [2, 19, 27], "pip3": 2, "dev": 2, "txt": 2, "riscv64": 2, "unknown": [2, 13], "elf": 2, "binutil": 2, "your": [2, 4], "favourit": 2, "On": [2, 27], "debian": 2, "base": [2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 27], "distro": 2, "call": [2, 4, 5, 10, 15, 17, 24, 27], "arch": [2, 13], "precommit": [2, 16], "hook": [2, 27], "pre": 2, "thi": [2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 24, 25, 26, 27], "automat": [2, 17, 18], "run": [2, 5, 26, 27], "linter": 2, "befor": [2, 4, 13, 14, 23, 27], "The": [2, 3, 8, 10, 11, 13, 14, 16, 18, 19, 20, 23, 24, 25, 27], "contain": [2, 5, 13, 18, 27], "number": [2, 12, 13, 14, 16, 18, 20, 26, 27], "which": [2, 3, 5, 8, 10, 11, 15, 16, 18, 20, 23, 24, 25, 27], "ar": [2, 3, 4, 5, 8, 13, 14, 16, 17, 18, 20, 23, 24, 25, 26, 27], "ci": [2, 26], "also": [2, 5, 16, 27], "intend": [2, 27], "local": [2, 13], "thei": [2, 5, 14, 17, 20, 23, 27], "unit": [2, 8, 10, 11, 12, 13, 14, 15, 16, 17, 23], "test": [2, 4, 13, 18, 26, 27], "By": [2, 27], "default": [2, 13, 14, 18, 27], "everi": [2, 10, 11, 14, 27], "avail": [2, 3, 13, 14, 15, 17, 26], "specif": [2, 8, 13, 20], "file": [2, 13, 18, 20], "can": [2, 3, 5, 8, 13, 14, 16, 17, 18, 20, 23, 24, 26, 27], "test_transact": 2, "an": [2, 3, 4, 5, 8, 10, 11, 13, 15, 16, 17, 18, 20, 24, 27], "exampl": [2, 5, 13, 17, 18, 19, 24, 26, 27], "One": [2, 18, 20, 27], "even": [2, 20, 27], "class": [2, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 27], "testschedul": 2, "Or": [2, 5], "method": [2, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 27], "test_singl": 2, "argument": [2, 5, 14, 15, 18, 25, 27], "actual": [2, 10, 19], "search": 2, "within": [2, 12], "full": [2, 13, 18, 19, 20, 27], "name": [2, 5, 18, 26, 27], "match": [2, 18, 24, 25], "queri": 2, "thank": 2, "given": [2, 5, 18, 24, 27], "uniqu": 2, "just": [2, 5], "l": [2, 13], "list": [2, 4, 10, 11, 13, 14, 17, 18, 19, 27], "help": [2, 20, 26], "e": [2, 4, 10, 13, 18, 20, 27], "g": [2, 4, 10, 13, 18, 20], "find": [2, 20], "parameter": 2, "t": [2, 4, 5, 10, 13, 18, 20, 24, 26, 27], "trace": [2, 6, 22], "waveform": 2, "vcd": 2, "format": [2, 5, 11, 18, 27], "gtkw": [2, 18], "gtkwave": [2, 18], "tool": [2, 12, 26], "__traces__": 2, "debug": [2, 18], "driven": 2, "v": [2, 3, 8, 13, 20, 24], "verbos": [2, 26], "make": [2, 3, 4, 10, 11, 20], "runner": 2, "more": [2, 16, 19, 20, 26], "It": [2, 5, 10, 11, 12, 13, 15, 16, 20, 23, 24, 27], "print": 2, "being": [2, 14, 18, 27], "check": [2, 4, 18, 20, 24, 25], "code": [2, 3, 4, 5, 18, 20, 27], "type": [2, 10, 11, 13, 18, 27], "should": [2, 3, 5, 8, 10, 13, 14, 15, 16, 18, 20, 23, 24, 25, 27], "subcommand": 2, "filenam": 2, "main": [2, 20, 23], "reformat": 2, "black": 2, "check_format": 2, "verifi": 2, "flake8": 2, "check_typ": 2, "pyright": 2, "same": [2, 5, 12, 13, 18, 27], "when": [2, 4, 5, 10, 14, 18, 20, 24, 25, 27], "confront": 2, "would": [2, 13, 20], "messag": 2, "you": [2, 4, 24, 26], "mai": [2, 26], "diff": 2, "wai": [2, 5, 10, 11, 13, 20, 27], "displai": 2, "chang": [2, 5, 24, 27], "appli": [2, 4, 20, 27], "chose": 2, "locat": [2, 3, 23], "issu": [2, 8, 10, 11, 12, 15, 18], "visual": 2, "core": [2, 6, 10, 11, 12, 13, 15, 16, 17, 20, 21, 22, 26], "architectur": [2, 20], "graph": [2, 6, 19, 22, 26], "one": [2, 5, 8, 10, 11, 14, 16, 18, 20, 23, 24, 25, 27], "support": [2, 10, 13, 15, 19, 27], "need": [2, 5, 10, 14, 20, 24, 26, 27], "pass": [2, 5, 16, 17, 18, 27], "appropri": [2, 24, 27], "p": [2, 13], "prune": [2, 27], "remov": [2, 20], "disconnect": 2, "node": 2, "f": [2, 13, 15, 26], "select": [2, 10, 11, 14, 15, 16, 17, 18], "elk": [2, 27], "eclips": 2, "layout": [2, 4, 5, 6, 9, 10, 14, 15, 16, 18, 21, 27], "kernel": [2, 20], "dot": [2, 27], "graphviz": 2, "mermaid": [2, 27], "document": [2, 19], "sphinx": 2, "html": [2, 3], "build": [2, 26], "coreblock": [3, 4, 26], "go": [3, 4, 20, 27], "out": [3, 10, 11, 12, 14, 16, 19, 27], "processor": [3, 19, 23], "implement": [3, 11, 13, 14, 19, 20, 23], "risc": [3, 8, 13], "microarchitectur": 3, "focu": 3, "flexibl": [3, 23], "allow": [3, 13, 18, 20, 27], "easili": [3, 27], "experi": 3, "differ": [3, 4, 11, 13, 14, 16, 20, 27], "compon": [3, 10, 13, 27], "doc": 3, "collect": [3, 13, 16, 17, 26, 27], "descript": [3, 19], "whole": [3, 10, 20, 27], "overview": [3, 19, 20], "high": 3, "level": [3, 13, 20], "found": 3, "version": 3, "page": [3, 20], "api": [3, 19], "kuznia": 3, "rdzeni": 3, "github": 3, "io": 3, "If": [4, 5, 8, 10, 13, 14, 17, 18, 20, 24, 27], "someth": [4, 5], "doesn": [4, 5, 18, 20], "work": [4, 5, 10, 15, 20, 27], "re": [4, 5, 14, 20, 27], "puzzl": 4, "why": 4, "through": 4, "see": [4, 5, 12], "ani": [4, 8, 10, 13, 14, 15, 18, 20], "point": [4, 13, 20], "case": [4, 8, 14, 15, 16, 18, 20, 27], "sure": 4, "us": [4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 27], "yield": 4, "function": [4, 5, 10, 11, 13, 15, 16, 18, 20, 26, 27], "testbenchio": 4, "notabl": 4, "except": [4, 6, 9, 13, 16, 18, 19, 21, 27], "settl": 4, "instead": [4, 5, 20, 27], "signal": [4, 10, 11, 14, 18, 19, 27], "unexpect": 4, "valu": [4, 10, 11, 13, 14, 15, 16, 17, 18, 24, 25, 27], "try": [4, 5, 20], "ad": [4, 13, 18, 26, 27], "right": [4, 27], "don": [4, 20, 24, 27], "do": [4, 10, 13, 20, 27], "eq": [4, 5, 27], "two": [4, 5, 10, 16, 17, 18, 20, 27], "record": [4, 5, 10, 11, 14, 18, 27], "assign": [4, 5, 17, 18, 27], "util": [4, 5, 6, 9, 15, 16, 21, 27], "amaranth": [4, 5, 10, 13, 14, 18, 26, 27], "statement": [4, 5, 18, 27], "some": [4, 5, 17, 20, 26, 27], "domain": [4, 27], "have": [4, 8, 13, 14, 16, 17, 18, 20, 26, 27], "combin": [4, 13, 16, 27], "loop": 4, "especi": 4, "simul": [4, 27], "hang": 4, "extend": [4, 13, 27], "spot": 4, "yourself": [4, 5, 26], "easi": [4, 5, 20], "fix": 4, "mistak": 4, "modular": 5, "design": [5, 12, 20, 27], "inspir": 5, "bluespec": 5, "program": [5, 13, 20], "languag": [5, 13], "wiki": 5, "compil": [5, 26], "idea": [5, 20], "interfac": [5, 10, 12, 14, 15, 16, 17, 19, 27], "hardwar": [5, 13, 19, 23], "modul": [5, 6, 21, 22], "A": [5, 10, 13, 27], "state": [5, 14, 19, 20, 27], "oper": [5, 8, 10, 11, 13, 20, 27], "perform": [5, 10, 11, 12, 13, 15, 17, 18, 26, 27], "singl": [5, 11, 12, 13, 15, 16, 18, 27], "clock": [5, 12, 23, 26, 27], "cycl": [5, 8, 11, 12, 14, 17, 20, 23, 27], "atom": [5, 13, 24], "either": [5, 10, 18, 27], "execut": [5, 11, 13, 14, 15, 16, 19, 23, 25, 27], "its": [5, 10, 15, 16, 17, 18, 20, 27], "entrieti": 5, "onli": [5, 11, 17, 18, 20, 27], "readi": [5, 10, 14, 15, 16, 17, 18, 19, 24, 27], "doe": 5, "conflict": [5, 27], "anoth": [5, 8, 10, 27], "schedul": [5, 6, 9, 19, 20, 21, 27], "defin": [5, 10, 17, 18, 27], "depend": [5, 6, 9, 17, 18, 21, 27], "other": [5, 17, 19, 27], "via": [5, 10, 27], "directli": [5, 13, 27], "link": 5, "indirectli": [5, 27], "multipl": [5, 8, 11, 12, 13, 14, 15, 16, 27], "them": [5, 13, 18, 20, 27], "access": [5, 8, 13, 17, 20], "coordin": 5, "system": [5, 13], "avoid": 5, "commun": [5, 20, 24], "caller": [5, 27], "both": [5, 18, 24, 27], "direct": [5, 18, 27], "back": 5, "structur": [5, 18, 19, 20, 24], "simplest": 5, "part": [5, 17, 20, 23, 27], "elaborat": [5, 9, 10, 11, 12, 14, 15, 16, 17, 18, 27], "block": [5, 8, 12, 13, 14, 15, 16, 19, 20, 27], "myth": 5, "def": [5, 27], "elabor": 5, "self": 5, "platform": [5, 26, 27], "tmodul": [5, 17, 27], "bodi": [5, 17, 27], "condit": [5, 27], "includ": [5, 18, 27], "like": [5, 8, 10, 14, 20, 27], "d": [5, 13, 27], "comb": [5, 27], "sig1": 5, "expr1": 5, "sync": [5, 27], "sig2": 5, "expr2": 5, "result": [5, 8, 10, 11, 12, 13, 14, 16, 17, 18, 20, 27], "arg_expr": 5, "analog": 5, "": [5, 13, 14, 18, 20, 27], "multiplex": 5, "rememb": [5, 20, 27], "insid": [5, 10, 27], "alwai": [5, 8, 17, 27], "onc": [5, 27], "becaus": [5, 20, 27], "resourc": [5, 11, 20, 26], "request": [5, 8, 10, 11, 12, 13, 14, 27], "paramet": [5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27], "bit": [5, 8, 10, 11, 12, 13, 14, 17, 18, 20, 24, 25, 27], "express": 5, "expr": 5, "As": [5, 8, 20], "typic": [5, 27], "declar": 5, "constructor": [5, 10, 27], "myotherth": 5, "__init__": [5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 27], "o": [5, 12, 20, 27], "my_method": 5, "input_layout": 5, "output_layout": 5, "def_method": [5, 27], "_": [5, 27], "arg": [5, 10, 11, 18, 27], "other_method": 5, "ret_expr": 5, "techniqu": 5, "present": [5, 18, 20, 27], "abov": 5, "conveni": [5, 27], "syntax": [5, 27], "particular": 5, "unnam": 5, "usual": [5, 20], "For": [5, 8, 13, 18, 24, 25, 26], "could": 5, "around": 5, "entir": [5, 8], "sometim": 5, "might": [5, 27], "altern": [5, 27], "decid": [5, 20, 23], "best": 5, "import": [5, 20], "question": 5, "ask": 5, "independ": [5, 8, 27], "thing": [5, 18], "lock": [5, 20, 27], "so": [5, 14, 16, 20, 27], "mayb": [5, 20], "extern": [5, 19, 27], "doubt": 5, "prefer": 5, "noth": 5, "els": [5, 17, 20, 27], "Such": 5, "adaptertran": [5, 27], "facilit": 5, "provid": [5, 10, 11, 13, 15, 17, 27], "most": [5, 8, 20, 27], "ones": 5, "connecttran": [5, 27], "connect": [5, 10, 14, 16, 17, 20, 27], "togeth": [5, 27], "fifo": [5, 6, 9, 16, 20, 21, 27], "queue": [5, 18, 20, 27], "adapt": [5, 27], "plain": [5, 27], "These": [5, 20, 26], "veri": [5, 20], "testbench": [5, 27], "parent": 5, "convers": 5, "true": [5, 13, 14, 18, 27], "possibl": [5, 18, 20, 27], "limit": [5, 14, 27], "impli": 5, "consid": [5, 20, 27], "subpackag": [6, 21], "frontend": [6, 9, 21, 23], "submodul": [6, 21, 22], "decod": [6, 9, 11, 15, 21], "fetch": [6, 8, 9, 13, 16, 17, 20, 21], "icach": [6, 9, 21], "rvc": [6, 9, 21], "content": [6, 21, 22], "alu": [6, 9, 13, 21], "div_unit": [6, 9, 21], "fu_decod": [6, 9, 21], "jumpbranch": [6, 9, 13, 21], "mul_unit": [6, 9, 21], "shift_unit": [6, 9, 13, 21], "zbc": [6, 9, 13, 21], "zb": [6, 9, 13, 21], "param": [6, 9, 10, 11, 15, 16, 17, 21], "configur": [6, 9, 15, 21], "fu_param": [6, 9, 21], "genparam": [6, 9, 10, 11, 12, 15, 16, 17, 21], "icache_param": [6, 9, 21], "instr": [6, 9, 10, 21], "isa": [6, 9, 10, 17, 21], "kei": [6, 9, 17, 18, 21], "optyp": [6, 9, 10, 11, 15, 16, 17, 21], "peripher": [6, 9, 21], "wishbon": [6, 9, 21], "wakeup_select": [6, 9, 21], "backend": [6, 9, 21], "func_blocks_unifi": [6, 9, 21], "retir": [6, 9, 21], "rs_func_block": [6, 9, 21], "structs_common": [6, 9, 21], "csr": [6, 9, 10, 13, 21], "csr_gener": [6, 9, 21], "debug_sign": [6, 9, 16, 21, 27], "protocol": [6, 9, 10, 15, 16, 21], "lib": [6, 22], "expos": [8, 18, 27], "three": [8, 10, 20, 27], "issue_req": [8, 10], "lookup": [8, 10], "accept_resp": 8, "flush": [8, 10, 20], "under": [8, 27], "4": [8, 11, 13, 27], "byte": [8, 13], "align": [8, 18], "c": [8, 13, 20], "extens": [8, 13], "introduc": [8, 20], "16": [8, 13, 20, 27], "relax": 8, "handl": [8, 11, 19, 27], "fulli": [8, 27], "pipelin": [8, 14, 15, 17, 20, 24, 27], "process": [8, 19, 27], "invok": [8, 10, 15, 16, 20, 24], "accept_r": [8, 10], "space": [8, 20], "simpli": 8, "latenc": [8, 20, 27], "least": 8, "miss": [8, 20], "occur": [8, 10], "arbitrarili": 8, "long": [8, 25], "ensur": 8, "refetch": 8, "howev": 8, "guarante": [8, 20], "alreadi": [8, 13, 16, 20], "been": 8, "still": [8, 20, 25, 27], "wait": [8, 14, 16, 20, 24, 25, 27], "accept": [8, 10, 11, 12, 17, 18, 27], "inform": [8, 15, 26, 27], "regard": 8, "error": [8, 10, 14, 18, 27], "mean": [8, 15, 25, 27], "dure": [8, 19, 23], "line": [8, 10, 13, 19], "refil": [8, 10], "subsequ": 8, "trigger": [8, 17], "32": [8, 11, 12, 13, 20], "128": [8, 13], "set": [8, 10, 11, 13, 15, 16, 17, 19, 24, 27], "size": [8, 13, 14, 18, 20, 27], "equal": 8, "31": [8, 13], "15": [8, 13], "14": [8, 13], "13": [8, 13], "12": [8, 13], "11": [8, 13], "09": 8, "08": 8, "07": 8, "06": 8, "05": 8, "04": 8, "03": 8, "02": 8, "01": 8, "00": 8, "tag": [8, 14, 16, 20, 24, 25], "index": [8, 18, 27], "offset": 8, "unsigned_multipl": [9, 11], "common": [9, 11, 18, 27], "fast_recurs": [9, 11], "sequenc": [9, 11, 15, 18, 27], "shift": [9, 11, 13], "gen_param": [9, 10, 11, 13, 15, 16, 17], "wb_instr_bu": 9, "wishbonebu": [9, 14], "wb_data_bu": 9, "simpl": [10, 15, 16, 18, 27], "transact": [10, 13, 14, 17, 18, 19, 24, 27], "instanti": 10, "instrdecod": 10, "combinatori": 10, "manner": [10, 14], "get_raw": 10, "push_decod": 10, "none": [10, 11, 13, 16, 17, 18, 27], "instanc": [10, 13, 15, 16, 27], "raw": 10, "instruct": [10, 11, 13, 15, 16, 17, 19, 20, 23, 24], "previou": [10, 14, 20], "fetchlayout": [10, 13], "send": [10, 13, 15, 16], "next": [10, 15, 16, 17, 20, 27], "describ": [10, 15, 16, 20, 27], "decodelayout": [10, 13, 15], "elementari": 10, "opcod": [10, 13, 24, 25], "funct3": [10, 11, 13], "etc": 10, "attribut": [10, 11, 12, 13, 14, 16, 17, 18, 27], "gen": [10, 11, 12, 16], "ilen": [10, 13], "identifi": [10, 13, 24], "funct3_v": 10, "1": [10, 11, 12, 13, 15, 17, 18, 20, 24, 25, 27], "funct7": [10, 11, 13], "seven": 10, "funct7_v": 10, "funct12": [10, 13], "twelv": 10, "funct12_v": 10, "rd": [10, 13], "reg_cnt_log": 10, "address": [10, 13, 14, 17, 19, 20], "regist": [10, 13, 15, 17, 20, 23], "rd_v": 10, "rs1": [10, 13], "hold": [10, 14, 17], "first": [10, 11, 15, 20, 24, 25, 27], "input": [10, 11, 16, 17, 18, 20, 24, 25, 27], "rs1_v": 10, "take": [10, 13, 14, 16, 23, 24, 26, 27], "form": [10, 13, 17, 20, 27], "rs2": [10, 13], "second": [10, 11, 15, 24, 25, 27], "rs2_v": 10, "imm": [10, 13], "xlen": [10, 11, 13, 17], "immedi": [10, 14], "were": [10, 20], "succ": 10, "fencetarget": [10, 13], "successor": 10, "fenc": [10, 13], "pred": 10, "predecessor": 10, "fm": 10, "fencefm": [10, 13], "mode": [10, 13, 20], "csr_alen": [10, 13], "control": [10, 13, 14, 17, 27], "sourc": [10, 15, 24], "kind": [10, 11, 13, 15], "illeg": 10, "wa": [10, 13, 17, 20, 27], "success": [10, 14], "fit": 10, "pc": [10, 17, 19], "increment": [10, 17], "ilen_byt": 10, "icacheinterfac": 10, "cont": 10, "cach": [10, 13, 19], "unalignedfetch": 10, "unalign": 10, "associ": [10, 13], "replac": [10, 12, 13, 24], "polici": 10, "pseudo": 10, "random": 10, "scheme": 10, "time": [10, 14, 17, 20, 26, 27], "trash": 10, "we": [10, 16, 20, 23, 24, 25, 26], "keep": [10, 27], "global": [10, 17, 20], "counter": [10, 13, 17], "abstract": [10, 12, 13], "awai": 10, "refiller_start": 10, "whenev": 10, "refiller_accept": 10, "word": [10, 13], "written": [10, 17, 25, 27], "last": [10, 15, 27], "transfer": [10, 14, 27], "over": [10, 17, 18, 27], "shouldn": 10, "until": [10, 20, 27], "start": [10, 11, 14, 20, 27], "icachelayout": [10, 13], "icacheparamet": [10, 13], "cacherefillerinterfac": 10, "start_refil": 10, "accept_refil": 10, "deserialize_addr": 10, "raw_addr": 10, "dict": [10, 14, 18, 27], "str": [10, 13, 18, 27], "hdl": [10, 13, 27], "ast": [10, 13, 27], "serialize_addr": 10, "addr": [10, 27], "icachebypass": 10, "wb_master": 10, "wishbonemast": [10, 13, 14], "haselabor": [10, 18, 27], "kwarg": [10, 13, 14, 18, 27], "simplewbcacherefil": 10, "instrdecompress": 10, "decompr_reg": 10, "rvc_reg": 10, "instr_mux": 10, "sel": 10, "int": [10, 11, 12, 13, 14, 16, 17, 18, 27], "enum": [10, 11, 13, 18, 27], "valuecast": [10, 13, 18, 27], "tupl": [10, 11, 15, 16, 17, 18, 27], "is_instr_compress": 10, "alucompon": [11, 13], "functionalcomponentparam": [11, 13, 16], "zba_en": 11, "fals": [11, 13, 18, 27], "zbb_enabl": 11, "get_modul": [11, 13, 16, 17], "funcunit": [11, 13, 16, 18], "get_optyp": [11, 13, 16, 17], "alufuncunit": 11, "alu_fn": 11, "alufn": 11, "object": [11, 13, 14, 27], "divcompon": 11, "ipc": 11, "div_fn": 11, "divfn": 11, "decodermanag": 11, "fn": 11, "intflag": [11, 13, 27], "enumer": [11, 13, 17, 18, 27], "div": [11, 13], "divu": [11, 13], "2": [11, 12, 13, 14, 17, 18, 27], "rem": [11, 13], "remu": [11, 13], "8": [11, 12, 13, 14, 27], "get_instruct": 11, "divunit": 11, "get_input": 11, "exceptionfuncunit": 11, "unit_fn": 11, "exceptionunitfn": 11, "exceptionunitcompon": [11, 13], "respons": [11, 14, 15, 27], "decode_fn": 11, "exec_fn": 11, "op": [11, 13], "check_optyp": 11, "bool": [11, 13, 17, 18, 27], "valid": [11, 13, 14, 15, 24], "get_decod": 11, "get_funct": 11, "get_op_typ": 11, "jumpbranchfuncunit": 11, "jb_fn": 11, "jumpbranchfn": 11, "jumpcompon": [11, 13], "mulcompon": 11, "mul_unit_typ": 11, "multyp": 11, "dsp_width": [11, 12], "mul_fn": 11, "mulfn": 11, "hot": [11, 18, 20], "wire": 11, "5": [11, 13, 23], "mul": [11, 13], "mulh": [11, 13], "mulhsu": [11, 13], "mulhu": [11, 13], "intenum": [11, 13, 17], "recursive_mul": 11, "fastest": 11, "multipli": [11, 12], "costli": [11, 20], "term": 11, "sequence_mul": 11, "dsp": [11, 12], "balanc": 11, "between": [11, 20, 27], "cost": [11, 19], "shift_mul": 11, "cheapest": 11, "russian": [11, 12], "peasant": [11, 12], "algorithm": [11, 12], "mulunit": 11, "unsign": [11, 12], "integ": [11, 13, 18], "standard": [11, 17, 18, 20], "funcunitlayout": [11, 13, 15, 16], "comput": [11, 12, 17, 20, 27], "mul_typ": 11, "shiftfuncunit": 11, "shift_unit_fn": 11, "shiftunitfn": 11, "shiftunitcompon": [11, 13], "clmultipli": 11, "carri": [11, 13, 26], "less": [11, 13], "product": [11, 27], "i1": [11, 12], "n": [11, 12, 13], "factor": 11, "i2": [11, 12], "reset": [11, 17, 19, 27], "new": [11, 13, 14, 18, 19, 20, 27], "busi": 11, "while": [11, 27], "progress": 11, "bit_width": 11, "recursion_depth": 11, "width": [11, 12, 13, 14, 17, 18, 27], "depth": [11, 14, 18, 27], "recurs": [11, 12, 18], "parallel": 11, "assum": [11, 16, 18, 20, 27], "power": [11, 18], "iterative_modul": 11, "recursive_modul": 11, "zbccompon": 11, "zbc_fn": 11, "zbcfn": 11, "clmul": [11, 13], "clmulh": [11, 13], "clmulr": [11, 13], "classmethod": [11, 27], "zbcunit": 11, "zbsfunction": 11, "in1": 11, "in2": 11, "zbscompon": 11, "bclr": [11, 13], "bext": [11, 13], "binv": [11, 13], "bset": [11, 13], "zbsunit": 11, "zbs_fn": 11, "dspmulunit": 12, "synthesi": [12, 19], "mulbaseunsign": 12, "unsignedmulunitlayout": [12, 13], "recursiveunsignedmul": 12, "fast": 12, "sequentialunsignedmul": 12, "sequenti": [12, 14], "classic": [12, 20], "shiftunsignedmul": 12, "cheap": 12, "multi": 12, "coreconfigur": 13, "func_units_config": 13, "blockcomponentparam": [13, 16, 17], "reserv": [13, 17, 19, 20], "station": [13, 19], "rsblockcompon": [13, 16], "rs_entri": [13, 16, 17], "lsublockcompon": 13, "compress": 13, "enabl": [13, 27], "embed": 13, "reduc": [13, 20, 27], "phys_regs_bit": 13, "physic": [13, 15, 20], "rob_entries_bit": 13, "reorder": [13, 20, 27], "buffer": [13, 14, 20, 24, 27], "start_pc": 13, "initi": [13, 19], "icache_en": 13, "disabl": [13, 27], "bypass": 13, "icache_wai": 13, "icache_sets_bit": 13, "log": [13, 20], "icache_block_size_bit": 13, "allow_partial_extens": 13, "partial": 13, "_implied_extens": 13, "extenst": 13, "flag": 13, "specifi": [13, 14, 17, 25, 27], "intern": [13, 18, 19, 27], "abc": [13, 27], "func_unit": [13, 16], "lsu": 13, "dummylsu": 13, "6": [13, 20], "7": 13, "dependencykei": 13, "u": [13, 20], "dependencymanag": [13, 17], "concret": 13, "frozen": 13, "lock_on_get": 13, "get_depend": 13, "empty_valid": 13, "without": [13, 15, 16, 20], "action": [13, 17, 27], "caus": [13, 20, 27], "rais": [13, 18, 20, 27], "keyerror": [13, 27], "add_depend": 13, "give": 13, "behavior": [13, 27], "track": 13, "across": 13, "add": [13, 27], "multpl": 13, "funcblock": [13, 15, 16, 17, 18], "get_rs_entry_count": [13, 16, 17], "optypes_support": 13, "iter": [13, 16, 17, 18, 27], "dependentcach": 13, "cfg": 13, "addr_width": [13, 14], "length": [13, 18, 20, 27], "word_width": 13, "machin": [13, 17], "num_of_wai": 13, "num_of_sets_bit": 13, "block_size_bit": 13, "btypeinstr": 13, "riscvinstr": 13, "pack": 13, "ebreakinstr": 13, "itypeinstr": 13, "illegalinstr": 13, "jtypeinstr": 13, "rtypeinstr": 13, "stypeinstr": 13, "utypeinstr": 13, "exceptioncaus": 13, "breakpoint": 13, "environment_call_from_m": 13, "environment_call_from_": 13, "9": 13, "environment_call_from_u": 13, "illegal_instruct": 13, "instruction_access_fault": 13, "instruction_address_misalign": 13, "instruction_page_fault": 13, "load_access_fault": 13, "load_address_misalign": 13, "load_page_fault": 13, "store_access_fault": 13, "store_address_misalign": 13, "store_page_fault": 13, "b": 13, "512": 13, "manipul": 13, "256": 13, "doubl": [13, 17, 20], "precis": [13, 20], "float": 13, "64": [13, 14], "98366": 13, "basic": [13, 19], "j": 13, "1024": 13, "dynam": [13, 18, 20], "decim": 13, "divis": 13, "16384": 13, "user": [13, 17, 20], "interrupt": [13, 19], "4096": 13, "simd": 13, "q": 13, "quad": 13, "2048": 13, "memori": [13, 14, 20, 27], "8192": 13, "vector": [13, 15, 19, 20], "xintmachinemod": 13, "8589934592": 13, "categor": 13, "privilieg": 13, "xintsupervisor": 13, "17179869184": 13, "supervisor": [13, 17], "zam": 13, "2097152": 13, "misalign": 13, "zba": 13, "268435456": 13, "zbb": 13, "536870912": 13, "1073741824": 13, "2147483648": 13, "zdinx": 13, "33554432": 13, "zfh": 13, "4194304": 13, "half": 13, "zfhmin": 13, "8388608": 13, "minim": 13, "zfinx": 13, "16777216": 13, "zhinx": 13, "67108864": 13, "zicntr": 13, "524288": 13, "timer": [13, 17], "zicsr": 13, "32768": 13, "statu": [13, 17], "zifencei": 13, "65536": 13, "zihintntl": 13, "262144": 13, "non": [13, 24, 27], "tempor": 13, "hint": [13, 27], "zihintpaus": 13, "131072": 13, "paus": 13, "energi": 13, "zihpm": 13, "1048576": 13, "zmmul": 13, "134217728": 13, "ztso": 13, "4294967296": 13, "total": 13, "store": [13, 16, 18, 20, 24, 25, 27], "tso": 13, "dev_i": 13, "dev_o": 13, "mem_r": 13, "mem_w": 13, "clz": 13, "1536": 13, "cpop": 13, "1538": 13, "ctz": 13, "1537": 13, "ebreak": 13, "ecal": 13, "mret": 13, "770": 13, "orcb": 13, "647": 13, "rev8_32": 13, "1688": 13, "rev8_64": 13, "1720": 13, "sextb": 13, "1540": 13, "sexth": 13, "1541": 13, "sret": 13, "258": 13, "wfi": 13, "261": 13, "zexth": 13, "AND": 13, "andn": 13, "beq": 13, "bge": 13, "bgeu": 13, "blt": 13, "bltu": 13, "bne": 13, "csrrc": 13, "csrrci": 13, "csrr": 13, "csrrsi": 13, "csrrw": 13, "csrrwi": 13, "divuw": 13, "divw": 13, "fencei": 13, "h": [13, 20], "hu": 13, "jalr": 13, "max": [13, 26], "maxu": 13, "min": 13, "minu": 13, "mulw": 13, "OR": 13, "orn": 13, "priv": 13, "remuw": 13, "remw": 13, "rev8": 13, "rol": 13, "ror": 13, "sh1add": 13, "sh2add": 13, "sh3add": 13, "sll": 13, "slt": 13, "sltu": 13, "sr": 13, "sub": 13, "w": [13, 20], "xnor": 13, "xor": 13, "36": 13, "52": 13, "20": 13, "48": 13, "muldiv": 13, "sa": 13, "sfencevma": 13, "sl": 13, "gather": 13, "numer": 13, "val": 13, "correspond": [13, 24, 27], "val_log": 13, "field": [13, 16, 17, 18, 24, 25, 27], "relev": [13, 27], "nativ": 13, "reg_cnt": 13, "maximum": 13, "bitwis": 13, "isa_str": 13, "string": 13, "refer": 13, "gcc": 13, "detail": [13, 19], "instrtyp": 13, "auipc": 13, "branch": [13, 20, 26, 27], "24": 13, "jal": 13, "27": 13, "25": 13, "load": [13, 20], "load_fp": 13, "lui": 13, "misc_mem": 13, "op32": 13, "op_imm": 13, "op_imm_32": 13, "store_fp": 13, "28": [13, 20], "a0": 13, "a1": 13, "a2": 13, "a3": 13, "a4": 13, "a5": 13, "a6": 13, "a7": 13, "17": 13, "fp": [13, 27], "gp": [13, 17], "ra": 13, "s0": 13, "s1": 13, "s10": 13, "26": 13, "s11": 13, "s2": 13, "18": 13, "s3": 13, "19": 13, "s4": 13, "s5": 13, "21": 13, "s6": 13, "22": 13, "s7": 13, "23": 13, "s8": 13, "s9": 13, "sp": 13, "t0": 13, "t1": 13, "t2": 13, "t3": 13, "t4": 13, "29": 13, "t5": 13, "30": [13, 20], "t6": 13, "tp": 13, "x1": 13, "x10": 13, "x11": 13, "x12": 13, "x13": 13, "x14": 13, "x15": 13, "x16": 13, "x17": 13, "x18": 13, "x19": 13, "x2": 13, "x20": 13, "x21": 13, "x22": 13, "x23": 13, "x24": 13, "x25": 13, "x26": 13, "x27": 13, "x28": 13, "x29": 13, "x3": 13, "x30": 13, "x31": 13, "x4": 13, "x5": 13, "x6": 13, "x7": 13, "x8": 13, "x9": 13, "zero": [13, 24, 27], "branchresolvedkei": 13, "unifierkei": [13, 16], "unifi": [13, 18], "alia": 13, "collector": [13, 27], "exceptionreportkei": 13, "simplekei": 13, "genericcsrregisterskei": 13, "genericcsrregist": [13, 17], "instructionprecommitkei": 13, "methodtryproduct": [13, 27], "wishbonedatakei": 13, "csrlayout": 13, "commonlayout": 13, "lsulayout": 13, "ratlayout": [13, 15], "rflayout": [13, 15], "roblayout": [13, 15], "rsinterfacelayout": 13, "rs_entries_bit": 13, "rslayout": [13, 15], "schedulerlayout": 13, "confus": 13, "address_gener": 13, "arithmet": 13, "bit_manipul": 13, "compar": [13, 19], "csr_imm": [13, 17], "csr_reg": [13, 17], "div_rem": 13, "33": 13, "logic": [13, 20, 25, 26], "single_bit_manipul": 13, "unary_bit_manipulation_1": 13, "unary_bit_manipulation_2": 13, "unary_bit_manipulation_3": 13, "unary_bit_manipulation_4": 13, "unary_bit_manipulation_5": 13, "optypes_required_by_extens": 13, "resolve_impl": 13, "ignore_unsupport": 13, "pipelinedwishbonemast": 14, "master": [14, 26], "wb_param": 14, "wishboneparamet": 14, "max_req": 14, "pend": 14, "wb": 14, "wishbonelayout": 14, "sent": [14, 16], "requestlayout": 14, "complet": [14, 16, 20], "resultlayout": 14, "requests_finish": 14, "generate_method_layout": 14, "wishbonearbit": 14, "arbit": 14, "slave": 14, "assert": 14, "cyc": 14, "grant": [14, 27], "round": [14, 18, 27], "robin": [14, 27], "slave_wb": 14, "intefac": 14, "boolean": [14, 27], "whether": [14, 18], "side": [14, 17, 20, 24, 25], "otherwis": 14, "wb_layout": 14, "wbmaster": 14, "becom": 14, "generate_layout": 14, "wishbonememoryslav": 14, "underneath": 14, "keyword": [14, 27], "underli": 14, "infer": [14, 27], "data_width": 14, "wishbonemux": 14, "muxer": 14, "master_wb": 14, "ssel_tga": 14, "corespond": 14, "tga": 14, "stb": 14, "note": [14, 17, 18, 27], "stare": 14, "finish": [14, 16], "stall": [14, 17, 20], "clear": [14, 18, 24, 25, 27], "delai": 14, "previous": 14, "deassert": 14, "dat_r": 14, "dat_w": 14, "adr": 14, "singal": 14, "granular": [14, 27], "smallest": 14, "port": [14, 27], "capabl": 14, "insert": [15, 16, 17, 18, 19, 20, 23, 24], "alloc": [15, 23, 24, 25], "renam": [15, 23], "entri": [15, 16, 18, 20, 23, 24, 25], "stuck": 15, "get_instr": 15, "get_free_reg": 15, "rat_renam": 15, "rob_put": 15, "rf_read1": 15, "rf_read2": 15, "reservation_st": 15, "decoded_instr": 15, "id": [15, 24, 25], "current": [15, 17, 20, 27], "free": [15, 19, 20, 25], "rat_rename_in": 15, "rat_rename_out": 15, "data_layout": [15, 27], "rf_read_out": 15, "rf_read_in": 15, "wakeupselect": 15, "wakeup": [15, 25], "firstli": 15, "get_readi": 15, "binari": 15, "where": [15, 20, 24, 25, 27], "th": [15, 27], "posit": [15, 24, 25], "row": [15, 19], "taken": 15, "take_row": 15, "get_ready_list_out": 15, "take_out": 15, "push": 15, "down": 15, "resultannounc": 16, "mark": [16, 19, 20, 27], "get_result": [16, 17, 18, 27], "serial": [16, 27], "than": [16, 20], "manytooneconnecttran": [16, 27], "rob_mark_don": 16, "rs_write_v": 16, "rf_write_v": 16, "end": [16, 20], "rob_id": 16, "reg_id": 16, "reg_val": 16, "funcblocksunifi": 16, "extra_methods_requir": 16, "get_extra_method": 16, "item": [16, 18], "rob_peek": 16, "rob_retir": 16, "r_rat_commit": 16, "free_rf_put": 16, "rf_free": 16, "exception_cause_get": 16, "rsfuncblock": 16, "With": 16, "csrblockcompon": 17, "csrlistkei": 17, "listkei": 17, "csrregist": 17, "behaviour": 17, "csrunit": 17, "csr_val": 17, "effect": [17, 20, 24, 25, 27], "_fu_read": 17, "_fu_writ": 17, "simultan": [17, 27], "ignor": 17, "prioriti": [17, 18, 27], "csr_number": 17, "ro_bit": 17, "mask": [17, 27], "those": [17, 20], "upper": 17, "0b11": 17, "discard": 17, "regitst": 17, "unitl": 17, "place": [17, 20, 24, 27], "put": [17, 24, 27], "receiv": [17, 27], "fetch_continu": 17, "resum": 17, "privilegelevel": 17, "csr_access_privileg": 17, "csr_addr": 17, "csraddress": 17, "3072": 17, "cycleh": 17, "3200": 17, "instret": 17, "3074": 17, "instreth": 17, "3202": 17, "mcaus": 17, "834": 17, "3073": 17, "timeh": 17, "3201": 17, "doublecountercsr": 17, "group": 17, "At": 17, "overflow": [17, 27], "low_addr": 17, "high_addr": 17, "repres": [17, 27], "lower": [17, 18], "higher": 17, "synthetis": 17, "exceptioncauseregist": 17, "rob_get_indic": 17, "should_update_priorii": 17, "current_caus": 17, "new_caus": 17, "frat": 17, "rrat": 17, "registerfil": 17, "reorderbuff": 17, "ready_for": 17, "auto_debug_sign": 18, "union": [18, 27], "view": [18, 27], "signalbundl": [18, 27], "map": [18, 19, 20, 27], "arrai": 18, "basicfifo": 18, "empti": [18, 27], "reiniti": 18, "init": 18, "shape": [18, 27], "shapecast": [18, 27], "rang": [18, 27], "layoutlik": [18, 27], "paramt": 18, "semaphor": 18, "max_count": 18, "assigntyp": 18, "rh": 18, "moduleconnector": 18, "anonym": 18, "onehotswitch": 18, "modulelik": [18, 27], "switch": [18, 20, 24, 27], "style": 18, "similar": [18, 20, 27], "benefit": 18, "represent": 18, "sig": 18, "onehotcas": 18, "0b01": 18, "0b10": 18, "onehotswitchdynam": 18, "liter": [18, 27], "variabl": [18, 27], "signifi": 18, "align_to_power_of_two": 18, "num": 18, "up": [18, 19, 25], "lh": 18, "assignarg": 18, "assignfield": 18, "lhs_strict": 18, "rhs_strict": 18, "safe": [18, 20], "structlayout": 18, "mismatch": 18, "accord": 18, "explicitli": 18, "castabl": 18, "determin": [18, 20], "subrecord": 18, "valueerror": 18, "bits_from_int": 18, "count_leading_zero": 18, "count_trailing_zero": 18, "flatten_sign": 18, "flatten": 18, "popcount": 18, "silence_mustus": 18, "introduct": 19, "assumpt": [19, 20], "made": [19, 20], "develop": 19, "environ": 19, "script": [19, 26], "run_test": 19, "py": [19, 26], "lint": 19, "sh": 19, "core_graph": 19, "build_doc": 19, "framework": [19, 24], "usag": [19, 27], "advanc": 19, "concept": 19, "nest": [19, 27], "schema": 19, "proposit": [19, 20], "slot": 19, "tabl": 19, "substitut": 19, "clean": 19, "problem": [19, 20], "checklist": 19, "benchmark": 19, "summari": 19, "paper": 19, "about": 19, "old": 19, "softwar": 19, "tlb": 19, "analysi": 19, "strategi": 19, "igpu": 19, "specul": 19, "gpu": 19, "effici": 19, "transactron": 19, "journal": 20, "articl": 20, "look": 20, "choic": 20, "primari": 20, "relat": [20, 27], "procedur": 20, "chosen": 20, "basi": 20, "improv": 20, "pretti": 20, "1993": 20, "2001": 20, "much": 20, "research": 20, "cpu": 20, "solv": 20, "due": [20, 27], "characterist": 20, "our": [20, 23], "what": 20, "peopl": 20, "probabl": 20, "lot": 20, "worth": 20, "walker": 20, "cragon": 20, "concurr": [20, 27], "ieee": 20, "vol": 20, "june": 20, "1995": 20, "moudgil": 20, "vassiliadi": 20, "micro": 20, "pp": 20, "58": 20, "67": 20, "februari": 20, "1996": 20, "survei": 20, "topic": 20, "cdc": 20, "6600": 20, "done": [20, 27], "jump": 20, "handler": 20, "ibm360": 20, "stop": [20, 27], "crai": 20, "here": [20, 24], "bigger": 20, "torng": 20, "martin": 20, "dai": 20, "probe": 20, "author": 20, "window": 20, "iw": 20, "dispatch": [20, 23, 24, 25], "didn": 20, "context": [20, 27], "copi": [20, 27], "restor": 20, "restart": 20, "few": 20, "encod": 20, "big": 20, "overhead": 20, "origin": [20, 27], "unfeas": 20, "job": 20, "addition": 20, "But": 20, "cooper": 20, "smaller": 20, "interest": 20, "propos": 20, "nrp": 20, "No": [20, 27], "itself": 20, "wast": 20, "how": [20, 24, 26], "mani": [20, 26, 27], "element": [20, 27], "left": [20, 27], "middl": [20, 23], "aamer": 20, "jaleel": 20, "bruce": 20, "jacob": 20, "cours": 20, "penalti": 20, "alpha": 20, "mip": 20, "concentr": 20, "properti": [20, 27], "short": 20, "inlin": 20, "observ": 20, "enough": 20, "live": 20, "known": 20, "fly": 20, "swap": 20, "nop": 20, "reexecut": 20, "indic": [20, 25, 27], "privileg": 20, "correct": [20, 24, 25], "contrast": 20, "tendenc": 20, "longer": 20, "hard": 20, "risk": 20, "linux": [20, 26], "purpos": [20, 27], "addit": 20, "hw": 20, "bore": 20, "treat": [20, 23], "mansur": 20, "samadzadeh": 20, "loai": 20, "garalnabi": 20, "checkpoint": 20, "repair": 20, "histori": 20, "futur": [20, 23, 24], "jaikrishnan": 20, "menon": 20, "marc": 20, "de": 20, "kruijf": 20, "karthikeyan": 20, "sankaralingam": 20, "2012": 20, "To": [20, 26], "low": 20, "boundari": 20, "rewritten": 20, "recompil": 20, "runtim": 20, "region": 20, "subregion": 20, "begin": 20, "small": 20, "overrid": 20, "barrier": 20, "warp": 20, "wrong": 20, "split": [20, 23, 27], "prevent": 20, "ivan": 20, "tanas": 20, "isaac": 20, "gelado": 20, "jorda": 20, "eduard": 20, "ayguad": 20, "nacho": 20, "navarro": 20, "2017": 20, "analys": 20, "problemat": 20, "successfulli": 20, "kill": 20, "modif": 20, "fail": 20, "repli": 20, "modifi": [20, 27], "claim": 20, "operand": [20, 24, 25], "replai": 20, "marker": 20, "jerom": 20, "hampton": 20, "2008": 20, "mention": 20, "alli": 20, "bailei": 20, "ab04": 20, "ag": 20, "younger": 20, "repeat": 20, "canon": 20, "eventu": 20, "aren": 20, "Its": 23, "task": [23, 27], "rss": 23, "phase": 23, "choos": 23, "potenti": 23, "merg": 23, "optim": 23, "todo": 23, "want": [24, 27], "feel": 24, "anyth": 24, "id_out": [24, 25], "id_rob": [24, 25], "id_rs1": [24, 25], "val_rs1": [24, 25], "id_rs2": [24, 25], "val_rs2": [24, 25], "fill": 24, "id_rsx": 24, "val_rsx": 24, "releas": 24, "comparison": 24, "null": [24, 25], "woken": 25, "invalid": 25, "src1": [25, 27], "src2": [25, 27], "inst_readi": 25, "synthes": 26, "circuit": 26, "consum": 26, "grow": 26, "yosi": 26, "prjtrelli": 26, "nextpnr": 26, "ecp5": 26, "manual": 26, "git": 26, "repositori": 26, "docker": 26, "imag": 26, "vuush": 26, "synth": 26, "amaranthsynthecp5": 26, "dockerfil": 26, "command": 26, "amd64": 26, "parse_benchmark_info": 26, "pars": 26, "extract": [26, 27], "frequenc": 26, "cell": 26, "ram": 26, "dff": 26, "dedic": 26, "subpag": 26, "transactionbas": 27, "serv": 27, "simultena": 27, "transactionmanag": 27, "rest": 27, "must": 27, "exclus": 27, "combination": 27, "data_out": 27, "data_in": 27, "nonexclus": 27, "single_cal": 27, "situat": 27, "happen": 27, "cannot": 27, "thrown": 27, "const": 27, "d1": 27, "d0": 27, "guard": 27, "av_comb": 27, "top_comb": 27, "combinationi": 27, "my_sum_method": 27, "arg1": 27, "arg2": 27, "sum": 27, "static": 27, "construct": 27, "blueprint": 27, "freshli": 27, "proxi": 27, "priorit": 27, "undefin": 27, "avoidedif": 27, "amount": 27, "useless": 27, "multplex": 27, "unguard": 27, "path": 27, "synchron": 27, "cond": 27, "pattern": 27, "elif": 27, "fsm": 27, "noreturn": 27, "regularli": 27, "met": 27, "explicit": 27, "implicit": 27, "add_conflict": 27, "aris": 27, "pair": 27, "omit": 27, "transactioncontext": 27, "stack": 27, "care": 27, "never": 27, "cc_schedul": 27, "callabl": 27, "methodmap": 27, "dsl": 27, "eager_deterministic_cc_schedul": 27, "add_transact": 27, "visual_graph": 27, "fragment": 27, "transactionmodul": 27, "wrapper": 27, "definit": 27, "wrap": 27, "transaction_context": 27, "decor": 27, "eleg": 27, "dictionari": 27, "whose": 27, "method_map": 27, "gr": 27, "cc": 27, "porder": 27, "eager": 27, "subsystem": 27, "isn": 27, "fair": 27, "lowest": 27, "highest": 27, "arbitr": 27, "agent": 27, "transactiongraph": 27, "vertic": 27, "edg": 27, "priorityord": 27, "linear": 27, "consist": 27, "constraint": 27, "trivial_roundrobin_cc_schedul": 27, "mainli": 27, "IN": 27, "inout": 27, "own": 27, "owner": 27, "ownershipgraph": 27, "root": 27, "dump": 27, "dump_dot": 27, "indent": 27, "dump_elk": 27, "dump_mermaid": 27, "get_hier_nam": 27, "obj": 27, "hierarch": 27, "yet": 27, "get_nam": 27, "insert_edg": 27, "fr": 27, "insert_nod": 27, "mermaid_direct": 27, "subgraph": 27, "remember_field": 27, "owner_id": 27, "adapterbas": 27, "mock": 27, "en": 27, "ifac": 27, "cattran": 27, "concaten": 27, "third": 27, "dst": 27, "clickin": 27, "click": 27, "interact": 27, "fpga": 27, "button": 27, "rise": 27, "btn": 27, "dat": 27, "retriev": 27, "clickout": 27, "led": 27, "ident": 27, "target": 27, "method_list": 27, "mechan": 27, "move": 27, "flow": 27, "revers": 27, "possibli": 27, "rev_layout": 27, "connectandtransformtran": 27, "transform": 27, "behav": 27, "equival": 27, "methodtransform": 27, "method1": 27, "method2": 27, "i_fun": 27, "recorddict": 27, "o_fun": 27, "vice": 27, "versa": 27, "compat": 27, "respect": 27, "fulfil": 27, "_rec": 27, "fifo_typ": 27, "syncfifo": 27, "fifotyp": 27, "conform": 27, "further": 27, "put_result": 27, "memorybank": 27, "read_req": 27, "read_resp": 27, "elem_count": 27, "safe_writ": 27, "optimis": 27, "increas": 27, "throughput": 27, "eg": 27, "x": 27, "later": 27, "methodfilt": 27, "filter": 27, "caveat": 27, "methodproduct": 27, "arbitrari": 27, "i_transform": 27, "o_transform": 27, "tri": 27, "succeed": 27, "client": 27, "somethig": 27, "server": 27, "deseri": 27, "proper": 27, "serialize_in": 27, "serialized_req_method": 27, "serialize_out": 27, "serialized_resp_method": 27, "port_count": 27, "len": 27, "resist": 27, "nonblock": 27, "overlap": 27, "catch": 27, "reason": 27, "mutual": 27, "influenc": 27, "cond1": 27, "cond2": 27, "tracingenabl": 27, "tracingfrag": 27, "lose": 27, "too": 27, "difficult": 27, "exact": 27, "copyright": 27, "subfrag": 27, "ir": 27, "tracingfragmenttransform": 27, "fragmenttransform": 27, "on_frag": 27, "tracinginst": 27}, "objects": {"": [[9, 0, 0, "-", "coreblocks"], [27, 0, 0, "-", "transactron"]], "coreblocks": [[9, 0, 0, "-", "core"], [10, 0, 0, "-", "frontend"], [11, 0, 0, "-", "fu"], [13, 0, 0, "-", "params"], [14, 0, 0, "-", "peripherals"], [15, 0, 0, "-", "scheduler"], [16, 0, 0, "-", "stages"], [17, 0, 0, "-", "structs_common"], [18, 0, 0, "-", "utils"]], "coreblocks.core": [[9, 1, 1, "", "Core"]], "coreblocks.core.Core": [[9, 2, 1, "", "__init__"]], "coreblocks.frontend": [[10, 0, 0, "-", "decode"], [10, 0, 0, "-", "decoder"], [10, 0, 0, "-", "fetch"], [10, 0, 0, "-", "icache"], [10, 0, 0, "-", "rvc"]], "coreblocks.frontend.decode": [[10, 1, 1, "", "Decode"]], "coreblocks.frontend.decode.Decode": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.decoder": [[10, 1, 1, "", "InstrDecoder"]], "coreblocks.frontend.decoder.InstrDecoder": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.fetch": [[10, 1, 1, "", "Fetch"], [10, 1, 1, "", "UnalignedFetch"]], "coreblocks.frontend.fetch.Fetch": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.fetch.UnalignedFetch": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.icache": [[10, 1, 1, "", "ICache"], [10, 1, 1, "", "ICacheBypass"], [10, 1, 1, "", "ICacheInterface"], [10, 1, 1, "", "SimpleWBCacheRefiller"]], "coreblocks.frontend.icache.ICache": [[10, 2, 1, "", "__init__"], [10, 2, 1, "", "deserialize_addr"], [10, 2, 1, "", "serialize_addr"]], "coreblocks.frontend.icache.ICacheBypass": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.icache.ICacheInterface": [[10, 2, 1, "", "__init__"], [10, 3, 1, "", "accept_res"], [10, 3, 1, "", "flush"], [10, 3, 1, "", "issue_req"]], "coreblocks.frontend.icache.SimpleWBCacheRefiller": [[10, 2, 1, "", "__init__"]], "coreblocks.frontend.rvc": [[10, 1, 1, "", "InstrDecompress"], [10, 4, 1, "", "is_instr_compressed"]], "coreblocks.frontend.rvc.InstrDecompress": [[10, 2, 1, "", "__init__"], [10, 2, 1, "", "decompr_reg"], [10, 2, 1, "", "instr_mux"]], "coreblocks.fu": [[11, 0, 0, "-", "alu"], [11, 0, 0, "-", "div_unit"], [11, 0, 0, "-", "exception"], [11, 0, 0, "-", "fu_decoder"], [11, 0, 0, "-", "jumpbranch"], [11, 0, 0, "-", "mul_unit"], [11, 0, 0, "-", "shift_unit"], [12, 0, 0, "-", "unsigned_multiplication"], [11, 0, 0, "-", "zbc"], [11, 0, 0, "-", "zbs"]], "coreblocks.fu.alu": [[11, 1, 1, "", "ALUComponent"], [11, 1, 1, "", "AluFuncUnit"]], "coreblocks.fu.alu.ALUComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.alu.AluFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.div_unit": [[11, 1, 1, "", "DivComponent"], [11, 1, 1, "", "DivFn"], [11, 1, 1, "", "DivUnit"], [11, 4, 1, "", "get_input"]], "coreblocks.fu.div_unit.DivComponent": [[11, 2, 1, "", "__init__"], [11, 3, 1, "", "div_fn"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"], [11, 3, 1, "", "ipc"]], "coreblocks.fu.div_unit.DivFn": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.div_unit.DivFn.Fn": [[11, 3, 1, "", "DIV"], [11, 3, 1, "", "DIVU"], [11, 3, 1, "", "REM"], [11, 3, 1, "", "REMU"]], "coreblocks.fu.div_unit.DivUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.exception": [[11, 1, 1, "", "ExceptionFuncUnit"], [11, 1, 1, "", "ExceptionUnitComponent"]], "coreblocks.fu.exception.ExceptionFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.exception.ExceptionUnitComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.fu_decoder": [[11, 1, 1, "", "Decoder"], [11, 1, 1, "", "DecoderManager"]], "coreblocks.fu.fu_decoder.Decoder": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.fu_decoder.DecoderManager": [[11, 3, 1, "", "Fn"], [11, 2, 1, "", "get_decoder"], [11, 2, 1, "", "get_function"], [11, 2, 1, "", "get_instructions"], [11, 2, 1, "", "get_op_types"]], "coreblocks.fu.jumpbranch": [[11, 1, 1, "", "JumpBranchFuncUnit"], [11, 1, 1, "", "JumpComponent"]], "coreblocks.fu.jumpbranch.JumpBranchFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.jumpbranch.JumpComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.mul_unit": [[11, 1, 1, "", "MulComponent"], [11, 1, 1, "", "MulFn"], [11, 1, 1, "", "MulType"], [11, 1, 1, "", "MulUnit"]], "coreblocks.fu.mul_unit.MulComponent": [[11, 2, 1, "", "__init__"], [11, 3, 1, "", "dsp_width"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"], [11, 3, 1, "", "mul_fn"], [11, 3, 1, "", "mul_unit_type"]], "coreblocks.fu.mul_unit.MulFn": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.mul_unit.MulFn.Fn": [[11, 3, 1, "", "MUL"], [11, 3, 1, "", "MULH"], [11, 3, 1, "", "MULHSU"], [11, 3, 1, "", "MULHU"]], "coreblocks.fu.mul_unit.MulType": [[11, 3, 1, "", "RECURSIVE_MUL"], [11, 3, 1, "", "SEQUENCE_MUL"], [11, 3, 1, "", "SHIFT_MUL"]], "coreblocks.fu.mul_unit.MulUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.shift_unit": [[11, 1, 1, "", "ShiftFuncUnit"], [11, 1, 1, "", "ShiftUnitComponent"]], "coreblocks.fu.shift_unit.ShiftFuncUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.shift_unit.ShiftUnitComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.unsigned_multiplication": [[12, 0, 0, "-", "common"], [12, 0, 0, "-", "fast_recursive"], [12, 0, 0, "-", "sequence"], [12, 0, 0, "-", "shift"]], "coreblocks.fu.unsigned_multiplication.common": [[12, 1, 1, "", "DSPMulUnit"], [12, 1, 1, "", "MulBaseUnsigned"]], "coreblocks.fu.unsigned_multiplication.common.DSPMulUnit": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.common.MulBaseUnsigned": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.fast_recursive": [[12, 1, 1, "", "RecursiveUnsignedMul"]], "coreblocks.fu.unsigned_multiplication.fast_recursive.RecursiveUnsignedMul": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.sequence": [[12, 1, 1, "", "SequentialUnsignedMul"]], "coreblocks.fu.unsigned_multiplication.sequence.SequentialUnsignedMul": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.unsigned_multiplication.shift": [[12, 1, 1, "", "ShiftUnsignedMul"]], "coreblocks.fu.unsigned_multiplication.shift.ShiftUnsignedMul": [[12, 2, 1, "", "__init__"]], "coreblocks.fu.zbc": [[11, 1, 1, "", "ClMultiplier"], [11, 1, 1, "", "ZbcComponent"], [11, 1, 1, "", "ZbcFn"], [11, 1, 1, "", "ZbcUnit"]], "coreblocks.fu.zbc.ClMultiplier": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "iterative_module"], [11, 2, 1, "", "recursive_module"]], "coreblocks.fu.zbc.ZbcComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"], [11, 3, 1, "", "recursion_depth"], [11, 3, 1, "", "zbc_fn"]], "coreblocks.fu.zbc.ZbcFn": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.zbc.ZbcFn.Fn": [[11, 3, 1, "", "CLMUL"], [11, 3, 1, "", "CLMULH"], [11, 3, 1, "", "CLMULR"]], "coreblocks.fu.zbc.ZbcUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.zbs": [[11, 1, 1, "", "Zbs"], [11, 1, 1, "", "ZbsComponent"], [11, 1, 1, "", "ZbsFunction"], [11, 1, 1, "", "ZbsUnit"]], "coreblocks.fu.zbs.Zbs": [[11, 2, 1, "", "__init__"]], "coreblocks.fu.zbs.ZbsComponent": [[11, 2, 1, "", "__init__"], [11, 2, 1, "", "get_module"], [11, 2, 1, "", "get_optypes"]], "coreblocks.fu.zbs.ZbsFunction": [[11, 1, 1, "", "Fn"], [11, 2, 1, "", "get_instructions"]], "coreblocks.fu.zbs.ZbsFunction.Fn": [[11, 3, 1, "", "BCLR"], [11, 3, 1, "", "BEXT"], [11, 3, 1, "", "BINV"], [11, 3, 1, "", "BSET"]], "coreblocks.fu.zbs.ZbsUnit": [[11, 2, 1, "", "__init__"]], "coreblocks.params": [[13, 0, 0, "-", "configurations"], [13, 0, 0, "-", "dependencies"], [13, 0, 0, "-", "fu_params"], [13, 0, 0, "-", "genparams"], [13, 0, 0, "-", "icache_params"], [13, 0, 0, "-", "instr"], [13, 0, 0, "-", "isa"], [13, 0, 0, "-", "keys"], [13, 0, 0, "-", "layouts"], [13, 0, 0, "-", "optypes"]], "coreblocks.params.configurations": [[13, 1, 1, "", "CoreConfiguration"]], "coreblocks.params.configurations.CoreConfiguration": [[13, 2, 1, "", "__init__"], [13, 3, 1, "", "allow_partial_extensions"], [13, 3, 1, "", "compressed"], [13, 3, 1, "", "embedded"], [13, 3, 1, "", "func_units_config"], [13, 3, 1, "", "icache_block_size_bits"], [13, 3, 1, "", "icache_enable"], [13, 3, 1, "", "icache_sets_bits"], [13, 3, 1, "", "icache_ways"], [13, 3, 1, "", "phys_regs_bits"], [13, 2, 1, "", "replace"], [13, 3, 1, "", "rob_entries_bits"], [13, 3, 1, "", "start_pc"], [13, 3, 1, "", "xlen"]], "coreblocks.params.dependencies": [[13, 1, 1, "", "DependencyKey"], [13, 1, 1, "", "DependencyManager"]], "coreblocks.params.dependencies.DependencyKey": [[13, 2, 1, "", "combine"], [13, 3, 1, "", "empty_valid"], [13, 3, 1, "", "lock_on_get"]], "coreblocks.params.dependencies.DependencyManager": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "add_dependency"], [13, 2, 1, "", "get_dependency"]], "coreblocks.params.fu_params": [[13, 1, 1, "", "BlockComponentParams"], [13, 1, 1, "", "FunctionalComponentParams"], [13, 4, 1, "", "optypes_supported"]], "coreblocks.params.fu_params.BlockComponentParams": [[13, 2, 1, "", "get_module"], [13, 2, 1, "", "get_optypes"], [13, 2, 1, "", "get_rs_entry_count"]], "coreblocks.params.fu_params.FunctionalComponentParams": [[13, 2, 1, "", "get_module"], [13, 2, 1, "", "get_optypes"]], "coreblocks.params.genparams": [[13, 1, 1, "", "GenParams"]], "coreblocks.params.genparams.GenParams": [[13, 2, 1, "", "__init__"]], "coreblocks.params.icache_params": [[13, 1, 1, "", "ICacheParameters"]], "coreblocks.params.icache_params.ICacheParameters": [[13, 2, 1, "", "__init__"]], "coreblocks.params.instr": [[13, 1, 1, "", "BTypeInstr"], [13, 1, 1, "", "EBreakInstr"], [13, 1, 1, "", "ITypeInstr"], [13, 1, 1, "", "IllegalInstr"], [13, 1, 1, "", "JTypeInstr"], [13, 1, 1, "", "RTypeInstr"], [13, 1, 1, "", "STypeInstr"], [13, 1, 1, "", "UTypeInstr"]], "coreblocks.params.instr.BTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.EBreakInstr": [[13, 2, 1, "", "__init__"]], "coreblocks.params.instr.ITypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.IllegalInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.JTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.RTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.STypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.instr.UTypeInstr": [[13, 2, 1, "", "__init__"], [13, 2, 1, "", "pack"]], "coreblocks.params.isa": [[13, 1, 1, "", "ExceptionCause"], [13, 1, 1, "", "Extension"], [13, 1, 1, "", "FenceFm"], [13, 1, 1, "", "FenceTarget"], [13, 1, 1, "", "Funct12"], [13, 1, 1, "", "Funct3"], [13, 1, 1, "", "Funct7"], [13, 1, 1, "", "ISA"], [13, 1, 1, "", "InstrType"], [13, 1, 1, "", "Opcode"], [13, 1, 1, "", "Registers"]], "coreblocks.params.isa.ExceptionCause": [[13, 3, 1, "", "BREAKPOINT"], [13, 3, 1, "", "ENVIRONMENT_CALL_FROM_M"], [13, 3, 1, "", "ENVIRONMENT_CALL_FROM_S"], [13, 3, 1, "", "ENVIRONMENT_CALL_FROM_U"], [13, 3, 1, "", "ILLEGAL_INSTRUCTION"], [13, 3, 1, "", "INSTRUCTION_ACCESS_FAULT"], [13, 3, 1, "", "INSTRUCTION_ADDRESS_MISALIGNED"], [13, 3, 1, "", "INSTRUCTION_PAGE_FAULT"], [13, 3, 1, "", "LOAD_ACCESS_FAULT"], [13, 3, 1, "", "LOAD_ADDRESS_MISALIGNED"], [13, 3, 1, "", "LOAD_PAGE_FAULT"], [13, 3, 1, "", "STORE_ACCESS_FAULT"], [13, 3, 1, "", "STORE_ADDRESS_MISALIGNED"], [13, 3, 1, "", "STORE_PAGE_FAULT"]], "coreblocks.params.isa.Extension": [[13, 3, 1, "", "A"], [13, 3, 1, "", "B"], [13, 3, 1, "", "C"], [13, 3, 1, "", "D"], [13, 3, 1, "", "E"], [13, 3, 1, "", "F"], [13, 3, 1, "", "G"], [13, 3, 1, "", "I"], [13, 3, 1, "", "J"], [13, 3, 1, "", "L"], [13, 3, 1, "", "M"], [13, 3, 1, "", "N"], [13, 3, 1, "", "P"], [13, 3, 1, "", "Q"], [13, 3, 1, "", "T"], [13, 3, 1, "", "V"], [13, 3, 1, "", "XINTMACHINEMODE"], [13, 3, 1, "", "XINTSUPERVISOR"], [13, 3, 1, "", "ZAM"], [13, 3, 1, "", "ZBA"], [13, 3, 1, "", "ZBB"], [13, 3, 1, "", "ZBC"], [13, 3, 1, "", "ZBS"], [13, 3, 1, "", "ZDINX"], [13, 3, 1, "", "ZFH"], [13, 3, 1, "", "ZFHMIN"], [13, 3, 1, "", "ZFINX"], [13, 3, 1, "", "ZHINX"], [13, 3, 1, "", "ZICNTR"], [13, 3, 1, "", "ZICSR"], [13, 3, 1, "", "ZIFENCEI"], [13, 3, 1, "", "ZIHINTNTL"], [13, 3, 1, "", "ZIHINTPAUSE"], [13, 3, 1, "", "ZIHPM"], [13, 3, 1, "", "ZMMUL"], [13, 3, 1, "", "ZTSO"]], "coreblocks.params.isa.FenceFm": [[13, 3, 1, "", "NONE"], [13, 3, 1, "", "TSO"]], "coreblocks.params.isa.FenceTarget": [[13, 3, 1, "", "DEV_I"], [13, 3, 1, "", "DEV_O"], [13, 3, 1, "", "MEM_R"], [13, 3, 1, "", "MEM_W"]], "coreblocks.params.isa.Funct12": [[13, 3, 1, "", "CLZ"], [13, 3, 1, "", "CPOP"], [13, 3, 1, "", "CTZ"], [13, 3, 1, "", "EBREAK"], [13, 3, 1, "", "ECALL"], [13, 3, 1, "", "MRET"], [13, 3, 1, "", "ORCB"], [13, 3, 1, "", "REV8_32"], [13, 3, 1, "", "REV8_64"], [13, 3, 1, "", "SEXTB"], [13, 3, 1, "", "SEXTH"], [13, 3, 1, "", "SRET"], [13, 3, 1, "", "WFI"], [13, 3, 1, "", "ZEXTH"]], "coreblocks.params.isa.Funct3": [[13, 3, 1, "", "ADD"], [13, 3, 1, "", "AND"], [13, 3, 1, "", "ANDN"], [13, 3, 1, "", "B"], [13, 3, 1, "", "BCLR"], [13, 3, 1, "", "BEQ"], [13, 3, 1, "", "BEXT"], [13, 3, 1, "", "BGE"], [13, 3, 1, "", "BGEU"], [13, 3, 1, "", "BINV"], [13, 3, 1, "", "BLT"], [13, 3, 1, "", "BLTU"], [13, 3, 1, "", "BNE"], [13, 3, 1, "", "BSET"], [13, 3, 1, "", "BU"], [13, 3, 1, "", "CLMUL"], [13, 3, 1, "", "CLMULH"], [13, 3, 1, "", "CLMULR"], [13, 3, 1, "", "CLZ"], [13, 3, 1, "", "CPOP"], [13, 3, 1, "", "CSRRC"], [13, 3, 1, "", "CSRRCI"], [13, 3, 1, "", "CSRRS"], [13, 3, 1, "", "CSRRSI"], [13, 3, 1, "", "CSRRW"], [13, 3, 1, "", "CSRRWI"], [13, 3, 1, "", "CTZ"], [13, 3, 1, "", "D"], [13, 3, 1, "", "DIV"], [13, 3, 1, "", "DIVU"], [13, 3, 1, "", "DIVUW"], [13, 3, 1, "", "DIVW"], [13, 3, 1, "", "FENCE"], [13, 3, 1, "", "FENCEI"], [13, 3, 1, "", "H"], [13, 3, 1, "", "HU"], [13, 3, 1, "", "JALR"], [13, 3, 1, "", "MAX"], [13, 3, 1, "", "MAXU"], [13, 3, 1, "", "MIN"], [13, 3, 1, "", "MINU"], [13, 3, 1, "", "MUL"], [13, 3, 1, "", "MULH"], [13, 3, 1, "", "MULHSU"], [13, 3, 1, "", "MULHU"], [13, 3, 1, "", "MULW"], [13, 3, 1, "", "OR"], [13, 3, 1, "", "ORCB"], [13, 3, 1, "", "ORN"], [13, 3, 1, "", "PRIV"], [13, 3, 1, "", "REM"], [13, 3, 1, "", "REMU"], [13, 3, 1, "", "REMUW"], [13, 3, 1, "", "REMW"], [13, 3, 1, "", "REV8"], [13, 3, 1, "", "ROL"], [13, 3, 1, "", "ROR"], [13, 3, 1, "", "SEXTB"], [13, 3, 1, "", "SEXTH"], [13, 3, 1, "", "SH1ADD"], [13, 3, 1, "", "SH2ADD"], [13, 3, 1, "", "SH3ADD"], [13, 3, 1, "", "SLL"], [13, 3, 1, "", "SLT"], [13, 3, 1, "", "SLTU"], [13, 3, 1, "", "SR"], [13, 3, 1, "", "SUB"], [13, 3, 1, "", "W"], [13, 3, 1, "", "XNOR"], [13, 3, 1, "", "XOR"], [13, 3, 1, "", "ZEXTH"]], "coreblocks.params.isa.Funct7": [[13, 3, 1, "", "ADD"], [13, 3, 1, "", "AND"], [13, 3, 1, "", "ANDN"], [13, 3, 1, "", "BCLR"], [13, 3, 1, "", "BEXT"], [13, 3, 1, "", "BINV"], [13, 3, 1, "", "BSET"], [13, 3, 1, "", "CLMUL"], [13, 3, 1, "", "CLZ"], [13, 3, 1, "", "CPOP"], [13, 3, 1, "", "CTZ"], [13, 3, 1, "", "MAX"], [13, 3, 1, "", "MIN"], [13, 3, 1, "", "MULDIV"], [13, 3, 1, "", "OR"], [13, 3, 1, "", "ORCB"], [13, 3, 1, "", "ORN"], [13, 3, 1, "", "REV8"], [13, 3, 1, "", "ROL"], [13, 3, 1, "", "ROR"], [13, 3, 1, "", "SA"], [13, 3, 1, "", "SEXTB"], [13, 3, 1, "", "SEXTH"], [13, 3, 1, "", "SFENCEVMA"], [13, 3, 1, "", "SH1ADD"], [13, 3, 1, "", "SH2ADD"], [13, 3, 1, "", "SH3ADD"], [13, 3, 1, "", "SL"], [13, 3, 1, "", "SLT"], [13, 3, 1, "", "SUB"], [13, 3, 1, "", "XNOR"], [13, 3, 1, "", "XOR"], [13, 3, 1, "", "ZEXTH"]], "coreblocks.params.isa.ISA": [[13, 2, 1, "", "__init__"]], "coreblocks.params.isa.InstrType": [[13, 3, 1, "", "B"], [13, 3, 1, "", "I"], [13, 3, 1, "", "J"], [13, 3, 1, "", "R"], [13, 3, 1, "", "S"], [13, 3, 1, "", "U"]], "coreblocks.params.isa.Opcode": [[13, 3, 1, "", "AUIPC"], [13, 3, 1, "", "BRANCH"], [13, 3, 1, "", "JAL"], [13, 3, 1, "", "JALR"], [13, 3, 1, "", "LOAD"], [13, 3, 1, "", "LOAD_FP"], [13, 3, 1, "", "LUI"], [13, 3, 1, "", "MISC_MEM"], [13, 3, 1, "", "OP"], [13, 3, 1, "", "OP32"], [13, 3, 1, "", "OP_IMM"], [13, 3, 1, "", "OP_IMM_32"], [13, 3, 1, "", "STORE"], [13, 3, 1, "", "STORE_FP"], [13, 3, 1, "", "SYSTEM"]], "coreblocks.params.isa.Registers": [[13, 3, 1, "", "A0"], [13, 3, 1, "", "A1"], [13, 3, 1, "", "A2"], [13, 3, 1, "", "A3"], [13, 3, 1, "", "A4"], [13, 3, 1, "", "A5"], [13, 3, 1, "", "A6"], [13, 3, 1, "", "A7"], [13, 3, 1, "", "FP"], [13, 3, 1, "", "GP"], [13, 3, 1, "", "RA"], [13, 3, 1, "", "S0"], [13, 3, 1, "", "S1"], [13, 3, 1, "", "S10"], [13, 3, 1, "", "S11"], [13, 3, 1, "", "S2"], [13, 3, 1, "", "S3"], [13, 3, 1, "", "S4"], [13, 3, 1, "", "S5"], [13, 3, 1, "", "S6"], [13, 3, 1, "", "S7"], [13, 3, 1, "", "S8"], [13, 3, 1, "", "S9"], [13, 3, 1, "", "SP"], [13, 3, 1, "", "T0"], [13, 3, 1, "", "T1"], [13, 3, 1, "", "T2"], [13, 3, 1, "", "T3"], [13, 3, 1, "", "T4"], [13, 3, 1, "", "T5"], [13, 3, 1, "", "T6"], [13, 3, 1, "", "TP"], [13, 3, 1, "", "X0"], [13, 3, 1, "", "X1"], [13, 3, 1, "", "X10"], [13, 3, 1, "", "X11"], [13, 3, 1, "", "X12"], [13, 3, 1, "", "X13"], [13, 3, 1, "", "X14"], [13, 3, 1, "", "X15"], [13, 3, 1, "", "X16"], [13, 3, 1, "", "X17"], [13, 3, 1, "", "X18"], [13, 3, 1, "", "X19"], [13, 3, 1, "", "X2"], [13, 3, 1, "", "X20"], [13, 3, 1, "", "X21"], [13, 3, 1, "", "X22"], [13, 3, 1, "", "X23"], [13, 3, 1, "", "X24"], [13, 3, 1, "", "X25"], [13, 3, 1, "", "X26"], [13, 3, 1, "", "X27"], [13, 3, 1, "", "X28"], [13, 3, 1, "", "X29"], [13, 3, 1, "", "X3"], [13, 3, 1, "", "X30"], [13, 3, 1, "", "X31"], [13, 3, 1, "", "X4"], [13, 3, 1, "", "X5"], [13, 3, 1, "", "X6"], [13, 3, 1, "", "X7"], [13, 3, 1, "", "X8"], [13, 3, 1, "", "X9"], [13, 3, 1, "", "ZERO"]], "coreblocks.params.keys": [[13, 1, 1, "", "BranchResolvedKey"], [13, 1, 1, "", "ExceptionReportKey"], [13, 1, 1, "", "GenericCSRRegistersKey"], [13, 1, 1, "", "InstructionPrecommitKey"], [13, 1, 1, "", "WishboneDataKey"]], "coreblocks.params.keys.BranchResolvedKey": [[13, 2, 1, "", "__init__"], [13, 3, 1, "", "unifier"]], "coreblocks.params.keys.ExceptionReportKey": [[13, 2, 1, "", "__init__"]], "coreblocks.params.keys.GenericCSRRegistersKey": [[13, 2, 1, "", "__init__"]], "coreblocks.params.keys.InstructionPrecommitKey": [[13, 2, 1, "", "__init__"], [13, 3, 1, "", "unifier"]], "coreblocks.params.keys.WishboneDataKey": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts": [[13, 1, 1, "", "CSRLayouts"], [13, 1, 1, "", "CommonLayouts"], [13, 1, 1, "", "DecodeLayouts"], [13, 1, 1, "", "FetchLayouts"], [13, 1, 1, "", "FuncUnitLayouts"], [13, 1, 1, "", "ICacheLayouts"], [13, 1, 1, "", "LSULayouts"], [13, 1, 1, "", "RATLayouts"], [13, 1, 1, "", "RFLayouts"], [13, 1, 1, "", "ROBLayouts"], [13, 1, 1, "", "RSInterfaceLayouts"], [13, 1, 1, "", "RSLayouts"], [13, 1, 1, "", "SchedulerLayouts"], [13, 1, 1, "", "UnsignedMulUnitLayouts"]], "coreblocks.params.layouts.CSRLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.CommonLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.DecodeLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.FetchLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.FuncUnitLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.ICacheLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.LSULayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RATLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RFLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.ROBLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RSInterfaceLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.RSLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.SchedulerLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.layouts.UnsignedMulUnitLayouts": [[13, 2, 1, "", "__init__"]], "coreblocks.params.optypes": [[13, 1, 1, "", "OpType"], [13, 4, 1, "", "optypes_required_by_extensions"]], "coreblocks.params.optypes.OpType": [[13, 3, 1, "", "ADDRESS_GENERATION"], [13, 3, 1, "", "ARITHMETIC"], [13, 3, 1, "", "AUIPC"], [13, 3, 1, "", "BIT_MANIPULATION"], [13, 3, 1, "", "BRANCH"], [13, 3, 1, "", "CLMUL"], [13, 3, 1, "", "COMPARE"], [13, 3, 1, "", "CSR_IMM"], [13, 3, 1, "", "CSR_REG"], [13, 3, 1, "", "DIV_REM"], [13, 3, 1, "", "EBREAK"], [13, 3, 1, "", "ECALL"], [13, 3, 1, "", "EXCEPTION"], [13, 3, 1, "", "FENCE"], [13, 3, 1, "", "FENCEI"], [13, 3, 1, "", "JAL"], [13, 3, 1, "", "JALR"], [13, 3, 1, "", "LOAD"], [13, 3, 1, "", "LOGIC"], [13, 3, 1, "", "MRET"], [13, 3, 1, "", "MUL"], [13, 3, 1, "", "SFENCEVMA"], [13, 3, 1, "", "SHIFT"], [13, 3, 1, "", "SINGLE_BIT_MANIPULATION"], [13, 3, 1, "", "SRET"], [13, 3, 1, "", "STORE"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_1"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_2"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_3"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_4"], [13, 3, 1, "", "UNARY_BIT_MANIPULATION_5"], [13, 3, 1, "", "UNKNOWN"], [13, 3, 1, "", "WFI"]], "coreblocks.peripherals": [[14, 0, 0, "-", "wishbone"]], "coreblocks.peripherals.wishbone": [[14, 1, 1, "", "PipelinedWishboneMaster"], [14, 1, 1, "", "WishboneArbiter"], [14, 1, 1, "", "WishboneBus"], [14, 1, 1, "", "WishboneLayout"], [14, 1, 1, "", "WishboneMaster"], [14, 1, 1, "", "WishboneMemorySlave"], [14, 1, 1, "", "WishboneMuxer"], [14, 1, 1, "", "WishboneParameters"]], "coreblocks.peripherals.wishbone.PipelinedWishboneMaster": [[14, 2, 1, "", "__init__"], [14, 2, 1, "", "generate_method_layouts"]], "coreblocks.peripherals.wishbone.WishboneArbiter": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneBus": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneLayout": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneMaster": [[14, 2, 1, "", "__init__"], [14, 2, 1, "", "generate_layouts"]], "coreblocks.peripherals.wishbone.WishboneMemorySlave": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneMuxer": [[14, 2, 1, "", "__init__"]], "coreblocks.peripherals.wishbone.WishboneParameters": [[14, 2, 1, "", "__init__"]], "coreblocks.scheduler": [[15, 0, 0, "-", "scheduler"], [15, 0, 0, "-", "wakeup_select"]], "coreblocks.scheduler.scheduler": [[15, 1, 1, "", "Scheduler"]], "coreblocks.scheduler.scheduler.Scheduler": [[15, 2, 1, "", "__init__"]], "coreblocks.scheduler.wakeup_select": [[15, 1, 1, "", "WakeupSelect"]], "coreblocks.scheduler.wakeup_select.WakeupSelect": [[15, 2, 1, "", "__init__"]], "coreblocks.stages": [[16, 0, 0, "-", "backend"], [16, 0, 0, "-", "func_blocks_unifier"], [16, 0, 0, "-", "retirement"], [16, 0, 0, "-", "rs_func_block"]], "coreblocks.stages.backend": [[16, 1, 1, "", "ResultAnnouncement"]], "coreblocks.stages.backend.ResultAnnouncement": [[16, 2, 1, "", "__init__"], [16, 2, 1, "", "debug_signals"]], "coreblocks.stages.func_blocks_unifier": [[16, 1, 1, "", "FuncBlocksUnifier"]], "coreblocks.stages.func_blocks_unifier.FuncBlocksUnifier": [[16, 2, 1, "", "__init__"], [16, 2, 1, "", "get_extra_method"]], "coreblocks.stages.retirement": [[16, 1, 1, "", "Retirement"]], "coreblocks.stages.retirement.Retirement": [[16, 2, 1, "", "__init__"]], "coreblocks.stages.rs_func_block": [[16, 1, 1, "", "RSBlockComponent"], [16, 1, 1, "", "RSFuncBlock"]], "coreblocks.stages.rs_func_block.RSBlockComponent": [[16, 2, 1, "", "__init__"], [16, 3, 1, "", "func_units"], [16, 2, 1, "", "get_module"], [16, 2, 1, "", "get_optypes"], [16, 2, 1, "", "get_rs_entry_count"], [16, 3, 1, "", "rs_entries"]], "coreblocks.stages.rs_func_block.RSFuncBlock": [[16, 2, 1, "", "__init__"]], "coreblocks.structs_common": [[17, 0, 0, "-", "csr"], [17, 0, 0, "-", "csr_generic"], [17, 0, 0, "-", "exception"], [17, 0, 0, "-", "rat"], [17, 0, 0, "-", "rf"], [17, 0, 0, "-", "rob"], [17, 0, 0, "-", "rs"]], "coreblocks.structs_common.csr": [[17, 1, 1, "", "CSRBlockComponent"], [17, 1, 1, "", "CSRListKey"], [17, 1, 1, "", "CSRRegister"], [17, 1, 1, "", "CSRUnit"], [17, 1, 1, "", "PrivilegeLevel"], [17, 4, 1, "", "csr_access_privilege"]], "coreblocks.structs_common.csr.CSRBlockComponent": [[17, 2, 1, "", "get_module"], [17, 2, 1, "", "get_optypes"], [17, 2, 1, "", "get_rs_entry_count"]], "coreblocks.structs_common.csr.CSRListKey": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr.CSRRegister": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr.CSRUnit": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr.PrivilegeLevel": [[17, 3, 1, "", "MACHINE"], [17, 3, 1, "", "SUPERVISOR"], [17, 3, 1, "", "USER"]], "coreblocks.structs_common.csr_generic": [[17, 1, 1, "", "CSRAddress"], [17, 1, 1, "", "DoubleCounterCSR"], [17, 1, 1, "", "GenericCSRRegisters"]], "coreblocks.structs_common.csr_generic.CSRAddress": [[17, 3, 1, "", "CYCLE"], [17, 3, 1, "", "CYCLEH"], [17, 3, 1, "", "INSTRET"], [17, 3, 1, "", "INSTRETH"], [17, 3, 1, "", "MCAUSE"], [17, 3, 1, "", "TIME"], [17, 3, 1, "", "TIMEH"]], "coreblocks.structs_common.csr_generic.DoubleCounterCSR": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.csr_generic.GenericCSRRegisters": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.exception": [[17, 1, 1, "", "ExceptionCauseRegister"], [17, 4, 1, "", "should_update_prioriy"]], "coreblocks.structs_common.exception.ExceptionCauseRegister": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rat": [[17, 1, 1, "", "FRAT"], [17, 1, 1, "", "RRAT"]], "coreblocks.structs_common.rat.FRAT": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rat.RRAT": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rf": [[17, 1, 1, "", "RegisterFile"]], "coreblocks.structs_common.rf.RegisterFile": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rob": [[17, 1, 1, "", "ReorderBuffer"]], "coreblocks.structs_common.rob.ReorderBuffer": [[17, 2, 1, "", "__init__"]], "coreblocks.structs_common.rs": [[17, 1, 1, "", "RS"]], "coreblocks.structs_common.rs.RS": [[17, 2, 1, "", "__init__"]], "coreblocks.utils": [[18, 0, 0, "-", "debug_signals"], [18, 0, 0, "-", "fifo"], [18, 0, 0, "-", "protocols"], [18, 0, 0, "-", "utils"]], "coreblocks.utils.debug_signals": [[18, 4, 1, "", "auto_debug_signals"]], "coreblocks.utils.fifo": [[18, 1, 1, "", "BasicFifo"], [18, 1, 1, "", "Semaphore"]], "coreblocks.utils.fifo.BasicFifo": [[18, 2, 1, "", "__init__"]], "coreblocks.utils.fifo.Semaphore": [[18, 2, 1, "", "__init__"]], "coreblocks.utils.protocols": [[18, 1, 1, "", "FuncBlock"], [18, 1, 1, "", "FuncUnit"], [18, 1, 1, "", "Unifier"]], "coreblocks.utils.protocols.FuncBlock": [[18, 2, 1, "", "__init__"], [18, 3, 1, "", "get_result"], [18, 3, 1, "", "insert"], [18, 3, 1, "", "select"], [18, 3, 1, "", "update"]], "coreblocks.utils.protocols.FuncUnit": [[18, 2, 1, "", "__init__"], [18, 3, 1, "", "accept"], [18, 3, 1, "", "issue"]], "coreblocks.utils.protocols.Unifier": [[18, 2, 1, "", "__init__"], [18, 3, 1, "", "method"]], "coreblocks.utils.utils": [[18, 1, 1, "", "AssignType"], [18, 1, 1, "", "ModuleConnector"], [18, 4, 1, "", "OneHotSwitch"], [18, 4, 1, "", "OneHotSwitchDynamic"], [18, 4, 1, "", "align_to_power_of_two"], [18, 4, 1, "", "assign"], [18, 4, 1, "", "bits_from_int"], [18, 4, 1, "", "count_leading_zeros"], [18, 4, 1, "", "count_trailing_zeros"], [18, 4, 1, "", "flatten_signals"], [18, 4, 1, "", "popcount"], [18, 4, 1, "", "silence_mustuse"]], "coreblocks.utils.utils.AssignType": [[18, 3, 1, "", "ALL"], [18, 3, 1, "", "COMMON"], [18, 3, 1, "", "RHS"]], "coreblocks.utils.utils.ModuleConnector": [[18, 2, 1, "", "__init__"]], "transactron": [[27, 1, 1, "", "Method"], [27, 1, 1, "", "TModule"], [27, 1, 1, "", "Transaction"], [27, 1, 1, "", "TransactionContext"], [27, 1, 1, "", "TransactionManager"], [27, 1, 1, "", "TransactionModule"], [27, 0, 0, "-", "core"], [27, 4, 1, "", "def_method"], [27, 0, 0, "-", "graph"], [27, 0, 0, "-", "lib"], [27, 0, 0, "-", "tracing"]], "transactron.Method": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "body"], [27, 2, 1, "", "debug_signals"], [27, 2, 1, "", "like"], [27, 2, 1, "", "proxy"]], "transactron.TModule": [[27, 2, 1, "", "AvoidedIf"], [27, 2, 1, "", "Case"], [27, 2, 1, "", "Default"], [27, 2, 1, "", "Elif"], [27, 2, 1, "", "Else"], [27, 2, 1, "", "FSM"], [27, 2, 1, "", "If"], [27, 2, 1, "", "State"], [27, 2, 1, "", "Switch"], [27, 2, 1, "", "__init__"], [27, 5, 1, "", "next"]], "transactron.Transaction": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "body"], [27, 2, 1, "", "debug_signals"]], "transactron.TransactionContext": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "get"], [27, 3, 1, "", "stack"]], "transactron.TransactionManager": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "add_transaction"], [27, 2, 1, "", "debug_signals"], [27, 2, 1, "", "visual_graph"]], "transactron.TransactionModule": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "transaction_context"]], "transactron.core": [[27, 1, 1, "", "Method"], [27, 1, 1, "", "Priority"], [27, 1, 1, "", "TModule"], [27, 1, 1, "", "Transaction"], [27, 1, 1, "", "TransactionContext"], [27, 1, 1, "", "TransactionManager"], [27, 1, 1, "", "TransactionModule"], [27, 4, 1, "", "def_method"], [27, 4, 1, "", "eager_deterministic_cc_scheduler"], [27, 4, 1, "", "trivial_roundrobin_cc_scheduler"]], "transactron.core.Method": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "body"], [27, 2, 1, "", "debug_signals"], [27, 2, 1, "", "like"], [27, 2, 1, "", "proxy"]], "transactron.core.Priority": [[27, 3, 1, "", "LEFT"], [27, 3, 1, "", "RIGHT"], [27, 3, 1, "", "UNDEFINED"]], "transactron.core.TModule": [[27, 2, 1, "", "AvoidedIf"], [27, 2, 1, "", "Case"], [27, 2, 1, "", "Default"], [27, 2, 1, "", "Elif"], [27, 2, 1, "", "Else"], [27, 2, 1, "", "FSM"], [27, 2, 1, "", "If"], [27, 2, 1, "", "State"], [27, 2, 1, "", "Switch"], [27, 2, 1, "", "__init__"], [27, 5, 1, "", "next"]], "transactron.core.Transaction": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "body"], [27, 2, 1, "", "debug_signals"]], "transactron.core.TransactionContext": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "get"], [27, 3, 1, "", "stack"]], "transactron.core.TransactionManager": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "add_transaction"], [27, 2, 1, "", "debug_signals"], [27, 2, 1, "", "visual_graph"]], "transactron.core.TransactionModule": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "transaction_context"]], "transactron.graph": [[27, 1, 1, "", "Direction"], [27, 1, 1, "", "Owned"], [27, 1, 1, "", "OwnershipGraph"]], "transactron.graph.Direction": [[27, 3, 1, "", "IN"], [27, 3, 1, "", "INOUT"], [27, 3, 1, "", "NONE"], [27, 3, 1, "", "OUT"]], "transactron.graph.Owned": [[27, 3, 1, "", "name"], [27, 3, 1, "", "owner"]], "transactron.graph.OwnershipGraph": [[27, 2, 1, "", "__init__"], [27, 2, 1, "", "dump"], [27, 2, 1, "", "dump_dot"], [27, 2, 1, "", "dump_elk"], [27, 2, 1, "", "dump_mermaid"], [27, 2, 1, "", "get_hier_name"], [27, 2, 1, "", "get_name"], [27, 2, 1, "", "insert_edge"], [27, 2, 1, "", "insert_node"], [27, 3, 1, "", "mermaid_direction"], [27, 2, 1, "", "prune"], [27, 2, 1, "", "remember"], [27, 2, 1, "", "remember_field"]], "transactron.lib": [[27, 1, 1, "", "Adapter"], [27, 1, 1, "", "AdapterTrans"], [27, 1, 1, "", "CatTrans"], [27, 1, 1, "", "ClickIn"], [27, 1, 1, "", "ClickOut"], [27, 1, 1, "", "Collector"], [27, 1, 1, "", "Connect"], [27, 1, 1, "", "ConnectAndTransformTrans"], [27, 1, 1, "", "ConnectTrans"], [27, 1, 1, "", "FIFO"], [27, 1, 1, "", "Forwarder"], [27, 1, 1, "", "ManyToOneConnectTrans"], [27, 1, 1, "", "MemoryBank"], [27, 1, 1, "", "MethodFilter"], [27, 1, 1, "", "MethodProduct"], [27, 1, 1, "", "MethodTransformer"], [27, 1, 1, "", "MethodTryProduct"], [27, 1, 1, "", "Serializer"], [27, 4, 1, "", "condition"]], "transactron.lib.Adapter": [[27, 2, 1, "", "__init__"]], "transactron.lib.AdapterTrans": [[27, 2, 1, "", "__init__"]], "transactron.lib.CatTrans": [[27, 2, 1, "", "__init__"]], "transactron.lib.ClickIn": [[27, 2, 1, "", "__init__"]], "transactron.lib.ClickOut": [[27, 2, 1, "", "__init__"]], "transactron.lib.Collector": [[27, 2, 1, "", "__init__"]], "transactron.lib.Connect": [[27, 2, 1, "", "__init__"]], "transactron.lib.ConnectAndTransformTrans": [[27, 2, 1, "", "__init__"]], "transactron.lib.ConnectTrans": [[27, 2, 1, "", "__init__"]], "transactron.lib.FIFO": [[27, 2, 1, "", "__init__"]], "transactron.lib.Forwarder": [[27, 2, 1, "", "__init__"]], "transactron.lib.ManyToOneConnectTrans": [[27, 2, 1, "", "__init__"]], "transactron.lib.MemoryBank": [[27, 2, 1, "", "__init__"]], "transactron.lib.MethodFilter": [[27, 2, 1, "", "__init__"]], "transactron.lib.MethodProduct": [[27, 2, 1, "", "__init__"]], "transactron.lib.MethodTransformer": [[27, 2, 1, "", "__init__"]], "transactron.lib.MethodTryProduct": [[27, 2, 1, "", "__init__"]], "transactron.lib.Serializer": [[27, 2, 1, "", "__init__"]], "transactron.tracing": [[27, 1, 1, "", "TracingEnabler"], [27, 1, 1, "", "TracingFragment"], [27, 1, 1, "", "TracingFragmentTransformer"], [27, 1, 1, "", "TracingInstance"]], "transactron.tracing.TracingFragment": [[27, 2, 1, "", "get"], [27, 2, 1, "", "prepare"], [27, 3, 1, "", "subfragments"]], "transactron.tracing.TracingFragmentTransformer": [[27, 2, 1, "", "on_fragment"]], "transactron.tracing.TracingInstance": [[27, 2, 1, "", "get"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"], "5": ["py", "property", "Python property"]}, "titleterms": {"list": 0, "assumpt": [0, 8], "made": 0, "dure": 0, "develop": [0, 2], "full": 1, "transact": [1, 5], "method": [1, 5, 24, 25], "graph": [1, 27], "environ": 2, "set": 2, "up": 2, "us": [2, 24, 25], "script": 2, "run_test": 2, "py": 2, "lint": 2, "sh": 2, "core_graph": 2, "build_doc": 2, "introduct": [3, 5, 20], "document": [3, 5, 26], "problem": 4, "checklist": 4, "coreblock": [5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21], "framework": 5, "basic": 5, "usag": [5, 26], "implement": [5, 24], "The": 5, "librari": 5, "advanc": 5, "concept": 5, "nest": 5, "api": 6, "transactron": [6, 22, 27], "instruct": [8, 25], "cach": 8, "interfac": [8, 24, 25], "address": 8, "map": 8, "exampl": 8, "packag": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 27], "subpackag": [9, 11], "submodul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 27], "core": [9, 27], "modul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 27], "content": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 27], "frontend": 10, "decod": 10, "fetch": 10, "icach": 10, "rvc": 10, "fu": [11, 12], "alu": 11, "div_unit": 11, "except": [11, 17, 20], "fu_decod": 11, "jumpbranch": 11, "mul_unit": 11, "shift_unit": 11, "zbc": 11, "zb": 11, "unsigned_multipl": 12, "common": 12, "fast_recurs": 12, "sequenc": 12, "shift": 12, "param": 13, "configur": 13, "depend": 13, "fu_param": 13, "genparam": 13, "icache_param": 13, "instr": 13, "isa": 13, "kei": 13, "layout": 13, "optyp": 13, "peripher": 14, "wishbon": 14, "schedul": [15, 23], "wakeup_select": 15, "stage": 16, "backend": 16, "func_blocks_unifi": 16, "retir": 16, "rs_func_block": 16, "structs_common": 17, "csr": 17, "csr_gener": 17, "rat": 17, "rf": 17, "rob": 17, "r": 17, "util": 18, "debug_sign": 18, "fifo": 18, "protocol": 18, "summari": 20, "paper": 20, "about": 20, "interrupt": 20, "handl": 20, "old": 20, "pc": 20, "out": 20, "order": 20, "execut": 20, "processor": 20, "In": 20, "line": 20, "softwar": 20, "manag": 20, "tlb": 20, "hardwar": 20, "cost": 20, "analysi": 20, "process": 20, "strategi": 20, "igpu": 20, "support": 20, "specul": 20, "gpu": 20, "effici": 20, "other": 20, "overview": [23, 25], "descript": 23, "schema": 23, "structur": 23, "more": 23, "detail": 23, "each": 23, "block": 23, "proposit": 24, "reserv": [24, 25], "station": [24, 25], "intern": 24, "data": 24, "actual": 24, "slot": [24, 25], "tabl": 24, "compar": [24, 25], "substitut": [24, 25], "read": [24, 25], "row": [24, 25], "clean": [24, 25], "get": [24, 25], "free": 24, "mark": [24, 25], "extern": [24, 25], "all": [24, 25], "reset": 25, "initi": 25, "state": 25, "insert": 25, "new": 25, "readi": 25, "vector": 25, "signal": 25, "synthesi": 26, "requir": 26, "benchmark": 26, "lib": 27, "trace": 27}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/shared_structs/Implementation/RS_impl.html b/shared_structs/Implementation/RS_impl.html index 5dadd3ef2..bae223875 100644 --- a/shared_structs/Implementation/RS_impl.html +++ b/shared_structs/Implementation/RS_impl.html @@ -252,7 +252,7 @@

    Read and clean row

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/shared_structs/RS.html b/shared_structs/RS.html index 2435c02df..f0740c96b 100644 --- a/shared_structs/RS.html +++ b/shared_structs/RS.html @@ -222,7 +222,7 @@

    External interface signals

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/synthesis/Synthesis.html b/synthesis/Synthesis.html index c5ee4cf00..41c46f342 100644 --- a/synthesis/Synthesis.html +++ b/synthesis/Synthesis.html @@ -151,7 +151,7 @@

    Benchmarks

    © Copyright Kuźnia Rdzeni, 2023. - Last updated on 09:14 2023-10-06. + Last updated on 10:23 2023-10-07.

    diff --git a/transactron.html b/transactron.html new file mode 100644 index 000000000..06f1e8d4c --- /dev/null +++ b/transactron.html @@ -0,0 +1,1985 @@ + + + + + + transactron package — Coreblocks documentation + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    transactron package

    +
    +

    Submodules

    +
    +
    +

    transactron.core module

    +
    +
    +class transactron.core.Method
    +

    Bases: TransactionBase

    +

    Transactional method.

    +

    A Method serves to interface a module with external Transactions +or Methods. It can be called by at most once in a given clock cycle. +When a given Method is required by multiple Transactions +(either directly, or indirectly via another Method) simultenaously, +at most one of them is granted by the TransactionManager, and the rest +of them must wait. (Non-exclusive methods are an exception to this +behavior.) Calling a Method always takes a single clock cycle.

    +

    Data is combinationally transferred between to and from Methods +using Amaranth Records. The transfer can take place in both directions +at the same time: from the called Method to the caller (data_out) +and from the caller to the called Method (data_in).

    +

    A module which defines a Method should use body or def_method +to describe the method’s effect on the module state.

    +
    +
    Attributes
    +
    +
    name: str

    Name of this Method.

    +
    +
    ready: Signal, in

    Signals that the method is ready to run in the current cycle. +Typically defined by calling body.

    +
    +
    run: Signal, out

    Signals that the method is called in the current cycle by some +Transaction. Defined by the TransactionManager.

    +
    +
    data_in: Record, out

    Contains the data passed to the Method by the caller +(a Transaction or another Method).

    +
    +
    data_out: Record, in

    Contains the data passed from the Method to the caller +(a Transaction or another Method). Typically defined by +calling body.

    +
    +
    +
    +
    +
    +
    +__init__(*, name: Optional[str] = None, i: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = (), o: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = (), nonexclusive: bool = False, single_caller: bool = False)
    +
    +
    Parameters
    +
    +
    name: str or None

    Name hint for this Method. If None (default) the name is +inferred from the variable name this Method is assigned to.

    +
    +
    i: record layout

    The format of data_in. +An int corresponds to a Record with a single data field.

    +
    +
    o: record layout

    The format of data_in. +An int corresponds to a Record with a single data field.

    +
    +
    nonexclusive: bool

    If true, the method is non-exclusive: it can be called by multiple +transactions in the same clock cycle. If such a situation happens, +the method still is executed only once, and each of the callers +receive its output. Nonexclusive methods cannot have inputs.

    +
    +
    single_caller: bool

    If true, this method is intended to be called from a single +transaction. An error will be thrown if called from multiple +transactions.

    +
    +
    +
    +
    +
    + +
    +
    +body(m: ~transactron.core.TModule, *, ready: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 1'd1), out: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 0'd0)) Iterator[Record]
    +

    Define method body

    +

    The body context manager can be used to define the actions +performed by a Method when it’s run. Each assignment added to +a domain under body is guarded by the run signal. +Combinational assignments which do not need to be guarded by run +can be added to m.d.av_comb or m.d.top_comb instead of m.d.comb. +Method calls can be performed under body.

    +
    +
    Parameters
    +
    +
    mTModule

    Module in which operations on signals should be executed, +body uses the combinational domain only.

    +
    +
    readySignal, in

    Signal to indicate if the method is ready to be run. By +default it is Const(1), so the method is always ready. +Assigned combinationially to the ready attribute.

    +
    +
    outRecord, in

    Data generated by the Method, which will be passed to +the caller (a Transaction or another Method). Assigned +combinationally to the data_out attribute.

    +
    +
    +
    +
    Returns
    +
    +
    data_inRecord, out

    Data passed from the caller (a Transaction or another +Method) to this Method.

    +
    +
    +
    +
    +

    Examples

    +
    m = Module()
    +my_sum_method = Method(i = Layout([("arg1",8),("arg2",8)]))
    +sum = Signal(16)
    +with my_sum_method.body(m, out = sum) as data_in:
    +    m.d.comb += sum.eq(data_in.arg1 + data_in.arg2)
    +
    +
    +
    + +
    +
    +debug_signals() Union[Signal, Record, View, Iterable[Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]], Mapping[str, Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]]]
    +
    + +
    +
    +static like(other: Method, *, name: Optional[str] = None) Method
    +

    Constructs a new Method based on another.

    +

    The returned Method has the same input/output data layouts as the +other Method.

    +
    +
    Parameters
    +
    +
    otherMethod

    The Method which serves as a blueprint for the new Method.

    +
    +
    namestr, optional

    Name of the new Method.

    +
    +
    +
    +
    Returns
    +
    +
    Method

    The freshly constructed Method.

    +
    +
    +
    +
    +
    + +
    +
    +proxy(m: TModule, method: Method)
    +

    Define as a proxy for another method.

    +

    The calls to this method will be forwarded to method.

    +
    +
    Parameters
    +
    +
    mTModule

    Module in which operations on signals should be executed, +proxy uses the combinational domain only.

    +
    +
    methodMethod

    Method for which this method is a proxy for.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.core.Priority
    +

    Bases: Enum

    +

    An enumeration.

    +
    +
    +LEFT = 2
    +

    Left transaction/method is prioritized over the right one.

    +
    + +
    +
    +RIGHT = 3
    +

    Right transaction/method is prioritized over the left one.

    +
    + +
    +
    +UNDEFINED = 1
    +

    Conflicting transactions/methods don’t have a priority order.

    +
    + +
    + +
    +
    +class transactron.core.TModule
    +

    Bases: ModuleLike, Elaboratable

    +

    Extended Amaranth module for use with transactions.

    +

    It includes three different combinational domains:

    +
      +
    • comb domain, works like the comb domain in plain Amaranth modules. +Statements in comb are guarded by every condition, including +AvoidedIf. This means they are guarded by transaction and method +bodies: they don’t execute if the given transaction/method is not run.

    • +
    • av_comb is guarded by all conditions except AvoidedIf. This means +they are not guarded by transaction and method bodies. This allows to +reduce the amount of useless multplexers due to transaction use, while +still allowing the use of conditions in transaction/method bodies.

    • +
    • top_comb is unguarded: statements added to this domain always +execute. It can be used to reduce combinational path length due to +multplexers while keeping related combinational and synchronous +statements together.

    • +
    +
    +
    +AvoidedIf(cond: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable)
    +
    + +
    +
    +Case(*patterns: str | int | enum.Enum)
    +
    + +
    +
    +Default()
    +
    + +
    +
    +Elif(cond)
    +
    + +
    +
    +Else()
    +
    + +
    +
    +FSM(reset: Optional[str] = None, domain: str = 'sync', name: str = 'fsm')
    +
    + +
    +
    +If(cond: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable)
    +
    + +
    +
    +State(name: str)
    +
    + +
    +
    +Switch(test: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable)
    +
    + +
    +
    +__init__()
    +
    + +
    +
    +property next: NoReturn
    +
    + +
    + +
    +
    +class transactron.core.Transaction
    +

    Bases: TransactionBase

    +

    Transaction.

    +

    A Transaction represents a task which needs to be regularly done. +Execution of a Transaction always lasts a single clock cycle. +A Transaction signals readiness for execution by setting the +request signal. If the conditions for its execution are met, it +can be granted by the TransactionManager.

    +

    A Transaction can, as part of its execution, call a number of +Methods. A Transaction can be granted only if every Method +it runs is ready.

    +

    A Transaction cannot execute concurrently with another, conflicting +Transaction. Conflicts between Transactions are either explicit +or implicit. An explicit conflict is added using the add_conflict +method. Implicit conflicts arise between pairs of Transactions +which use the same Method.

    +

    A module which defines a Transaction should use body to +describe used methods and the transaction’s effect on the module state. +The used methods should be called inside the body’s +with block.

    +
    +
    Attributes
    +
    +
    name: str

    Name of this Transaction.

    +
    +
    request: Signal, in

    Signals that the transaction wants to run. If omitted, the transaction +is always ready. Defined in the constructor.

    +
    +
    grant: Signal, out

    Signals that the transaction is granted by the TransactionManager, +and all used methods are called.

    +
    +
    +
    +
    +
    +
    +__init__(*, name: Optional[str] = None, manager: Optional[TransactionManager] = None)
    +
    +
    Parameters
    +
    +
    name: str or None

    Name hint for this Transaction. If None (default) the name is +inferred from the variable name this Transaction is assigned to. +If the Transaction was not assigned, the name is inferred from +the class name where the Transaction was constructed.

    +
    +
    manager: TransactionManager

    The TransactionManager controlling this Transaction. +If omitted, the manager is received from TransactionContext.

    +
    +
    +
    +
    +
    + +
    +
    +body(m: ~transactron.core.TModule, *, request: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 1'd1)) Iterator[Transaction]
    +

    Defines the Transaction body.

    +

    This context manager allows to conveniently define the actions +performed by a Transaction when it’s granted. Each assignment +added to a domain under body is guarded by the grant signal. +Combinational assignments which do not need to be guarded by +grant can be added to m.d.top_comb or m.d.av_comb instead of +m.d.comb. Method calls can be performed under body.

    +
    +
    Parameters
    +
    +
    m: TModule

    The module where the Transaction is defined.

    +
    +
    request: Signal

    Indicates that the Transaction wants to be executed. By +default it is Const(1), so it wants to be executed in +every clock cycle.

    +
    +
    +
    +
    +
    + +
    +
    +debug_signals() Union[Signal, Record, View, Iterable[Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]], Mapping[str, Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]]]
    +
    + +
    + +
    +
    +class transactron.core.TransactionContext
    +

    Bases: object

    +
    +
    +__init__(manager: TransactionManager)
    +
    + +
    +
    +classmethod get() TransactionManager
    +
    + +
    +
    +stack: list[transactron.core.TransactionManager] = []
    +
    + +
    + +
    +
    +class transactron.core.TransactionManager
    +

    Bases: Elaboratable

    +

    Transaction manager

    +

    This module is responsible for granting Transactions and running +Methods. It takes care that two conflicting Transactions +are never granted in the same clock cycle.

    +
    +
    +__init__(cc_scheduler: ~collections.abc.Callable[[MethodMap, dict['Transaction', set['Transaction']], set['Transaction'], dict['Transaction', int]], ~amaranth.hdl.dsl.Module] = <function eager_deterministic_cc_scheduler>)
    +
    + +
    +
    +add_transaction(transaction: Transaction)
    +
    + +
    +
    +debug_signals() Union[Signal, Record, View, Iterable[Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]], Mapping[str, Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]]]
    +
    + +
    +
    +visual_graph(fragment)
    +
    + +
    + +
    +
    +class transactron.core.TransactionModule
    +

    Bases: Elaboratable

    +

    TransactionModule is used as wrapper on Elaboratable classes, +which adds support for transactions. It creates a +TransactionManager which will handle transaction scheduling +and can be used in definition of Methods and Transactions.

    +
    +
    +__init__(elaboratable: HasElaborate, manager: Optional[TransactionManager] = None)
    +
    +
    Parameters
    +
    +
    elaboratable: HasElaborate

    The Elaboratable which should be wrapped to add support for +transactions and methods.

    +
    +
    +
    +
    +
    + +
    +
    +transaction_context() TransactionContext
    +
    + +
    + +
    +
    +transactron.core.def_method(m: ~transactron.core.TModule, method: ~transactron.core.Method, ready: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 1'd1))
    +

    Define a method.

    +

    This decorator allows to define transactional methods in an +elegant way using Python’s def syntax. Internally, def_method +uses Method.body.

    +

    The decorated function should take keyword arguments corresponding to the +fields of the method’s input layout. The **kwargs syntax is supported. +Alternatively, it can take one argument named arg, which will be a +record with input signals.

    +

    The returned value can be either a record with the method’s output layout +or a dictionary of outputs.

    +
    +
    Parameters
    +
    +
    m: TModule

    Module in which operations on signals should be executed.

    +
    +
    method: Method

    The method whose body is going to be defined.

    +
    +
    ready: Signal

    Signal to indicate if the method is ready to be run. By +default it is Const(1), so the method is always ready. +Assigned combinationally to the ready attribute.

    +
    +
    +
    +
    +

    Examples

    +
    m = Module()
    +my_sum_method = Method(i=[("arg1",8),("arg2",8)], o=[("res",8)])
    +@def_method(m, my_sum_method)
    +def _(arg1, arg2):
    +    return arg1 + arg2
    +
    +
    +

    Alternative syntax (keyword args in dictionary):

    +
    @def_method(m, my_sum_method)
    +def _(**args):
    +    return args["arg1"] + args["arg2"]
    +
    +
    +

    Alternative syntax (arg record):

    +
    @def_method(m, my_sum_method)
    +def _(arg):
    +    return {"res": arg.arg1 + arg.arg2}
    +
    +
    +
    + +
    +
    +transactron.core.eager_deterministic_cc_scheduler(method_map: MethodMap, gr: dict['Transaction', set['Transaction']], cc: set['Transaction'], porder: dict['Transaction', int]) Module
    +

    This function generates an eager scheduler for the transaction +subsystem. It isn’t fair, because it starts transactions using +transaction index in cc as a priority. Transaction with the lowest +index has the highest priority.

    +

    If there are two different transactions which have no conflicts then +they will be started concurrently.

    +
    +
    Parameters
    +
    +
    managerTransactionManager

    TransactionManager which uses this instance of scheduler for +arbitrating which agent should get a grant signal.

    +
    +
    grTransactionGraph

    Graph of conflicts between transactions, where vertices are transactions and edges are conflicts.

    +
    +
    ccSet[Transaction]

    Connected components of the graph gr for which scheduler +should be generated.

    +
    +
    porderPriorityOrder

    Linear ordering of transactions which is consistent with priority constraints.

    +
    +
    +
    +
    +
    + +
    +
    +transactron.core.trivial_roundrobin_cc_scheduler(method_map: MethodMap, gr: dict['Transaction', set['Transaction']], cc: set['Transaction'], porder: dict['Transaction', int]) Module
    +

    This function generates a simple round-robin scheduler for the transaction +subsystem. In a one cycle there will be at most one transaction granted +(in a given connected component of the conflict graph), even if there is +another ready, non-conflicting, transaction. It is mainly for testing +purposes.

    +
    +
    Parameters
    +
    +
    managerTransactionManager

    TransactionManager which uses this instance of scheduler for +arbitrating which agent should get grant signal.

    +
    +
    grTransactionGraph

    Graph of conflicts between transactions, where vertices are transactions and edges are conflicts.

    +
    +
    ccSet[Transaction]

    Connected components of the graph gr for which scheduler +should be generated.

    +
    +
    porderPriorityOrder

    Linear ordering of transactions which is consistent with priority constraints.

    +
    +
    +
    +
    +
    + +
    +
    +

    transactron.graph module

    +

    Utilities for extracting dependency graphs from Amaranth designs.

    +
    +
    +class transactron.graph.Direction
    +

    Bases: IntFlag

    +

    An enumeration.

    +
    +
    +IN = 1
    +
    + +
    +
    +INOUT = 3
    +
    + +
    +
    +NONE = 0
    +
    + +
    +
    +OUT = 2
    +
    + +
    + +
    +
    +class transactron.graph.Owned
    +

    Bases: ABC

    +
    +
    +name: str
    +
    + +
    +
    +owner: Optional[Elaboratable]
    +
    + +
    + +
    +
    +class transactron.graph.OwnershipGraph
    +

    Bases: object

    +
    +
    +__init__(root)
    +
    + +
    +
    +dump(fp, format: Literal['dot', 'elk', 'mermaid'])
    +
    + +
    +
    +dump_dot(fp, owner: Optional[int] = None, indent: str = '')
    +
    + +
    +
    +dump_elk(fp, owner: Optional[int] = None, indent: str = '')
    +
    + +
    +
    +dump_mermaid(fp, owner: Optional[int] = None, indent: str = '')
    +
    + +
    +
    +get_hier_name(obj: Owned) str
    +

    Get hierarchical name. +Might raise KeyError if not yet hierarchized.

    +
    + +
    +
    +get_name(obj: Owned) str
    +
    + +
    +
    +insert_edge(fr: Owned, to: Owned, direction: Direction = Direction.OUT)
    +
    + +
    +
    +insert_node(obj: Owned)
    +
    + +
    +
    +mermaid_direction = ['---', '-->', '<--', '<-->']
    +
    + +
    +
    +prune(owner: Optional[int] = None)
    +

    Mark all empty subgraphs.

    +
    + +
    +
    +remember(owner: Elaboratable) int
    +
    + +
    +
    +remember_field(owner_id: int, field: str, obj: Elaboratable)
    +
    + +
    + +
    +
    +

    transactron.lib module

    +
    +
    +class transactron.lib.Adapter
    +

    Bases: AdapterBase

    +

    Adapter method.

    +

    Creates a method controlled by plain Amaranth signals. One of the +possible uses is to mock a method in a testbench.

    +
    +
    Attributes
    +
    +
    en: Signal, in

    Activates the method (sets the ready signal).

    +
    +
    done: Signal, out

    Signals that the method is called (returns the run signal).

    +
    +
    data_in: Record, in

    Data returned from the defined method.

    +
    +
    data_out: Record, out

    Data passed as argument to the defined method.

    +
    +
    +
    +
    +
    +
    +__init__(*, name: Optional[str] = None, i: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = (), o: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = ())
    +
    +
    Parameters
    +
    +
    i: record layout

    The input layout of the defined method.

    +
    +
    o: record layout

    The output layout of the defined method.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.AdapterTrans
    +

    Bases: AdapterBase

    +

    Adapter transaction.

    +

    Creates a transaction controlled by plain Amaranth signals. Allows to +expose a method to plain Amaranth code, including testbenches.

    +
    +
    Attributes
    +
    +
    en: Signal, in

    Activates the transaction (sets the request signal).

    +
    +
    done: Signal, out

    Signals that the transaction is performed (returns the grant +signal).

    +
    +
    data_in: Record, in

    Data passed to the iface method.

    +
    +
    data_out: Record, out

    Data returned from the iface method.

    +
    +
    +
    +
    +
    +
    +__init__(iface: Method)
    +
    +
    Parameters
    +
    +
    iface: Method

    The method to be called by the transaction.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.CatTrans
    +

    Bases: Elaboratable

    +

    Concatenating transaction.

    +

    Concatenates the results of two methods and passes the result to the +third method.

    +
    +
    +__init__(src1: Method, src2: Method, dst: Method)
    +
    +
    Parameters
    +
    +
    src1: Method

    First input method.

    +
    +
    src2: Method

    Second input method.

    +
    +
    dst: Method

    The method which receives the concatenation of the results of input +methods.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.ClickIn
    +

    Bases: Elaboratable

    +

    Clicked input.

    +

    Useful for interactive simulations or FPGA button/switch interfaces. +On a rising edge (tested synchronously) of btn, the get method +is enabled, which returns the data present on dat at the time. +Inputs are synchronized.

    +
    +
    Attributes
    +
    +
    get: Method

    The method for retrieving data from the input. Accepts an empty +argument, returns a Record.

    +
    +
    btn: Signal, in

    The button input.

    +
    +
    dat: Record, in

    The data input.

    +
    +
    +
    +
    +
    +
    +__init__(layout: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]])
    +
    +
    Parameters
    +
    +
    layout: record layout

    The data format for the input.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.ClickOut
    +

    Bases: Elaboratable

    +

    Clicked output.

    +

    Useful for interactive simulations or FPGA button/LED interfaces. +On a rising edge (tested synchronously) of btn, the put method +is enabled, which, when called, changes the value of the dat signal.

    +
    +
    Attributes
    +
    +
    put: Method

    The method for retrieving data from the input. Accepts a Record, +returns empty result.

    +
    +
    btn: Signal, in

    The button input.

    +
    +
    dat: Record, out

    The data output.

    +
    +
    +
    +
    +
    +
    +__init__(layout: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]])
    +
    +
    Parameters
    +
    +
    layout: record layout

    The data format for the output.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.Collector
    +

    Bases: Elaboratable

    +

    Single result collector.

    +

    Creates method that collects results of many methods with identical +layouts. Each call of this method will return a single result of one +of the provided methods.

    +
    +
    Attributes
    +
    +
    method: Method

    Method which returns single result of provided methods.

    +
    +
    +
    +
    +
    +
    +__init__(targets: list[transactron.core.Method])
    +
    +
    Parameters
    +
    +
    method_list: list[Method]

    List of methods from which results will be collected.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.Connect
    +

    Bases: Elaboratable

    +

    Forwarding by transaction simultaneity

    +

    Provides a means to connect two transactions with forwarding +by means of the transaction simultaneity mechanism. It provides +two methods: read, and write, which always execute simultaneously. +Typical use case is for moving data from write to read, but +data flow in the reverse direction is also possible.

    +
    +
    Attributes
    +
    +
    read: Method

    The read method. Accepts a (possibly empty) Record, returns +a Record.

    +
    +
    write: Method

    The write method. Accepts a Record, returns a (possibly empty) +Record.

    +
    +
    +
    +
    +
    +
    +__init__(layout: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = (), rev_layout: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = ())
    +
    +
    Parameters
    +
    +
    layout: record layout

    The format of records forwarded.

    +
    +
    rev_layout: record layout

    The format of records forwarded in the reverse direction.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.ConnectAndTransformTrans
    +

    Bases: Elaboratable

    +

    Connecting transaction with transformations.

    +

    Behaves like ConnectTrans, but modifies the transferred data using +functions or Method`s. Equivalent to a combination of +`ConnectTrans and MethodTransformer. The transformation +functions take two parameters, a Module and the Record being +transformed.

    +
    +
    +__init__(method1: Method, method2: Method, *, i_fun: Optional[Callable[[TModule, Record], amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable | collections.abc.Mapping[str, RecordDict]]] = None, o_fun: Optional[Callable[[TModule, Record], amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable | collections.abc.Mapping[str, RecordDict]]] = None)
    +
    +
    Parameters
    +
    +
    method1: Method

    First method.

    +
    +
    method2: Method

    Second method, and the method being transformed.

    +
    +
    i_fun: function or Method, optional

    Input transformation (method1 to method2).

    +
    +
    o_fun: function or Method, optional

    Output transformation (method2 to method1).

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.ConnectTrans
    +

    Bases: Elaboratable

    +

    Simple connecting transaction.

    +

    Takes two methods and creates a transaction which calls both of them. +Result of the first method is connected to the argument of the second, +and vice versa. Allows easily connecting methods with compatible +layouts.

    +
    +
    +__init__(method1: Method, method2: Method)
    +
    +
    Parameters
    +
    +
    method1: Method

    First method.

    +
    +
    method2: Method

    Second method.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.FIFO
    +

    Bases: Elaboratable

    +

    FIFO module.

    +

    Provides a transactional interface to Amaranth FIFOs. Exposes two methods: +read, and write. Both methods are ready only when they can +be executed – i.e. the queue is respectively not empty / not full. +It is possible to simultaneously read and write in a single clock cycle, +but only if both readiness conditions are fulfilled.

    +
    +
    Attributes
    +
    +
    read: Method

    The read method. Accepts an empty argument, returns a Record.

    +
    +
    write: Method

    The write method. Accepts a Record, returns empty result.

    +
    +
    +
    +
    +
    +
    +__init__(layout: ~typing.Union[~amaranth.hdl._rec.Layout, ~typing.Sequence[~typing.Union[~typing.Tuple[str, ~typing.Union[~amaranth.hdl.ast.Shape, ~amaranth.hdl.ast.ShapeCastable, int, range, ~typing.Type[~enum.Enum], LayoutLike]], ~typing.Tuple[str, ~typing.Union[~amaranth.hdl.ast.Shape, ~amaranth.hdl.ast.ShapeCastable, int, range, ~typing.Type[~enum.Enum], LayoutLike], ~amaranth.hdl._rec.Direction]]]], depth: int, fifo_type=<class 'amaranth.lib.fifo.SyncFIFO'>)
    +
    +
    Parameters
    +
    +
    layout: record layout

    The format of records stored in the FIFO.

    +
    +
    depth: int

    Size of the FIFO.

    +
    +
    fifoType: Elaboratable

    FIFO module conforming to Amaranth library FIFO interface. Defaults +to SyncFIFO.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.Forwarder
    +

    Bases: Elaboratable

    +

    Forwarding with overflow buffering

    +

    Provides a means to connect two transactions with forwarding. Exposes +two methods: read, and write. When both of these methods are +executed simultaneously, data is forwarded between them. If write +is executed, but read is not, the value cannot be forwarded, +but is stored into an overflow buffer. No further writes are +possible until the overflow buffer is cleared by read.

    +

    The write method is scheduled before read.

    +
    +
    Attributes
    +
    +
    read: Method

    The read method. Accepts an empty argument, returns a Record.

    +
    +
    write: Method

    The write method. Accepts a Record, returns empty result.

    +
    +
    +
    +
    +
    +
    +__init__(layout: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]])
    +
    +
    Parameters
    +
    +
    layout: record layout

    The format of records forwarded.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.ManyToOneConnectTrans
    +

    Bases: Elaboratable

    +

    Many-to-one method connection.

    +

    Connects each of a set of methods to another method using separate +transactions. Equivalent to a set of ConnectTrans.

    +
    +
    +__init__(*, get_results: list[transactron.core.Method], put_result: Method)
    +
    +
    Parameters
    +
    +
    get_results: list[Method]

    Methods to be connected to the put_result method.

    +
    +
    put_result: Method

    Common method for each of the connections created.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.MemoryBank
    +

    Bases: Elaboratable

    +

    MemoryBank module.

    +

    Provides a transactional interface to synchronous Amaranth Memory with one +read and one write port. It supports optionally writing with given granularity.

    +
    +
    Attributes
    +
    +
    read_req: Method

    The read request method. Accepts an addr from which data should be read. +Only ready if there is there is a place to buffer response.

    +
    +
    read_resp: Method

    The read response method. Return data_layout Record which was saved on addr given by last +read_req method call. Only ready after read_req call.

    +
    +
    write: Method

    The write method. Accepts addr where data should be saved, data in form of data_layout +and optionally mask if granularity is not None. 1 in mask means that appropriate part should be written.

    +
    +
    +
    +
    +
    +
    +__init__(*, data_layout: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]], elem_count: int, granularity: Optional[int] = None, safe_writes: bool = True)
    +
    +
    Parameters
    +
    +
    data_layout: record layout

    The format of records stored in the Memory.

    +
    +
    elem_count: int

    Number of elements stored in Memory.

    +
    +
    granularity: Optional[int]

    Granularity of write, forwarded to Amaranth. If None the whole record is always saved at once. +If not, the width of data_layout is split into granularity parts, which can be saved independently.

    +
    +
    safe_writes: bool

    Set to False if an optimisation can be done to increase throughput of writes. This will cause that +writes will be reordered with respect to reads eg. in sequence “read A, write A X”, read can return +“X” even when write was called later. By default True, which disable optimisation.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.MethodFilter
    +

    Bases: Elaboratable

    +

    Method filter.

    +

    Takes a target method and creates a method which calls the target method +only when some condition is true. The condition function takes two +parameters, a module and the input Record of the method. Non-zero +return value is interpreted as true. Alternatively to using a function, +a Method can be passed as a condition.

    +

    Caveat: because of the limitations of transaction scheduling, the target +method is locked for usage even if it is not called.

    +
    +
    Attributes
    +
    +
    method: Method

    The transformed method.

    +
    +
    +
    +
    +
    +
    +__init__(target: Method, condition: Callable[[TModule, Record], amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable], default: Optional[Union[Value, int, Enum, ValueCastable, Mapping[str, RecordDict]]] = None)
    +
    +
    Parameters
    +
    +
    target: Method

    The target method.

    +
    +
    condition: function or Method

    The condition which, when true, allows the call to target. When +false, default is returned.

    +
    +
    default: Value or dict, optional

    The default value returned from the filtered method when the condition +is false. If omitted, zero is returned.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.MethodProduct
    +

    Bases: Elaboratable

    +
    +
    +__init__(targets: list[transactron.core.Method], combiner: Optional[Tuple[Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]], Callable[[TModule, list[amaranth.hdl._rec.Record]], amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable | collections.abc.Mapping[str, RecordDict]]]] = None)
    +

    Method product.

    +

    Takes arbitrary, non-zero number of target methods, and constructs +a method which calls all of the target methods using the same +argument. The return value of the resulting method is, by default, +the return value of the first of the target methods. A combiner +function can be passed, which can compute the return value from +the results of every target method.

    +
    +
    Parameters
    +
    +
    targets: list[Method]

    A list of methods to be called.

    +
    +
    combiner: (int or method layout, function), optional

    A pair of the output layout and the combiner function. The +combiner function takes two parameters: a Module and +a list of outputs of the target methods.

    +
    +
    +
    +
    Attributes
    +
    +
    method: Method

    The product method.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.MethodTransformer
    +

    Bases: Elaboratable

    +

    Method transformer.

    +

    Takes a target method and creates a transformed method which calls the +original target method, transforming the input and output values. +The transformation functions take two parameters, a Module and the +Record being transformed. Alternatively, a Method can be +passed.

    +
    +
    Attributes
    +
    +
    method: Method

    The transformed method.

    +
    +
    +
    +
    +
    +
    +__init__(target: Method, *, i_transform: Optional[Tuple[Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]], Callable[[TModule, Record], amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable | collections.abc.Mapping[str, RecordDict]]]] = None, o_transform: Optional[Tuple[Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]], Callable[[TModule, Record], amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable | collections.abc.Mapping[str, RecordDict]]]] = None)
    +
    +
    Parameters
    +
    +
    target: Method

    The target method.

    +
    +
    i_transform: (record layout, function or Method), optional

    Input transformation. If specified, it should be a pair of a +function and a input layout for the transformed method. +If not present, input is not transformed.

    +
    +
    o_transform: (record layout, function or Method), optional

    Output transformation. If specified, it should be a pair of a +function and a output layout for the transformed method. +If not present, output is not transformed.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.MethodTryProduct
    +

    Bases: Elaboratable

    +
    +
    +__init__(targets: list[transactron.core.Method], combiner: Mapping[str, 'RecordDict']]]] = None)
    +

    Method product with optional calling.

    +

    Takes arbitrary, non-zero number of target methods, and constructs +a method which tries to call all of the target methods using the same +argument. The methods which are not ready are not called. The return +value of the resulting method is, by default, empty. A combiner +function can be passed, which can compute the return value from the +results of every target method.

    +
    +
    Parameters
    +
    +
    targets: list[Method]

    A list of methods to be called.

    +
    +
    combiner: (int or method layout, function), optional

    A pair of the output layout and the combiner function. The +combiner function takes two parameters: a Module and +a list of pairs. Each pair contains a bit which signals +that a given call succeeded, and the result of the call.

    +
    +
    +
    +
    Attributes
    +
    +
    method: Method

    The product method.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.lib.Serializer
    +

    Bases: Elaboratable

    +

    Module to serialize request-response methods.

    +

    Provides a transactional interface to connect many client Modules (which request somethig using method call) +with a server Module which provides method to request operation and method to get response.

    +

    Requests are being serialized from many clients and forwarded to a server which can process only one request +at the time. Responses from server are deserialized and passed to proper client. Serializer assumes, that +responses from the server are in-order, so the order of responses is the same as order of requests.

    +
    +
    Attributes
    +
    +
    serialize_in: list[Method]

    List of request methods. Data layouts are the same as for serialized_req_method.

    +
    +
    serialize_out: list[Method]

    List of response methods. Data layouts are the same as for serialized_resp_method. +i-th response method provides responses for requests from i-th serialize_in method.

    +
    +
    +
    +
    +
    +
    +__init__(*, port_count: int, serialized_req_method: Method, serialized_resp_method: Method, depth: int = 4)
    +
    +
    Parameters
    +
    +
    port_count: int

    Number of ports, which should be generated. len(serialize_in)=len(serialize_out)=port_count

    +
    +
    serialized_req_method: Method

    Request method provided by server’s Module.

    +
    +
    serialized_resp_method: Method

    Response method provided by server’s Module.

    +
    +
    depth: int

    Number of requests which can be forwarded to server, before server provides first response. Describe +the resistance of Serializer to latency of server in case when server is fully pipelined.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +transactron.lib.condition(m: TModule, *, nonblocking: bool = False, priority: bool = True)
    +

    Conditions using simultaneous transactions.

    +

    This context manager allows to easily define conditions utilizing +nested transactions and the simultaneous transactions mechanism. +It is similar to Amaranth’s If, but allows to call different and +possibly overlapping method sets in each branch. Each of the branches is +defined using a separate nested transaction.

    +

    Inside the condition body, branches can be added, which are guarded +by Boolean conditions. A branch is considered for execution if its +condition is true and the called methods can be run. A catch-all, +default branch can be added, which can be executed only if none of +the other branches execute. Note that the default branch can run +even if some of the conditions are true, but their branches can’t +execute for other reasons.

    +
    +
    Parameters
    +
    +
    mTModule

    A module where the condition is defined.

    +
    +
    nonblockingbool

    States that the condition should not block the containing method +or transaction from running, even when every branch cannot run. +If nonblocking is false and every branch cannot run (because of +a false condition or disabled called methods), the whole method +or transaction will be stopped from running.

    +
    +
    prioritybool

    States that the conditions are not mutually exclusive and should +be tested in order. This influences the scheduling order of generated +transactions.

    +
    +
    +
    +
    +

    Examples

    +
    with condition(m) as branch:
    +    with branch(cond1):
    +        ...
    +    with branch(cond2):
    +        ...
    +    with branch():  # default, optional
    +        ...
    +
    +
    +
    + +
    +
    +

    transactron.tracing module

    +

    Utilities for extracting dependencies from Amaranth.

    +
    +
    +class transactron.tracing.TracingEnabler
    +

    Bases: object

    +
    + +
    +
    +class transactron.tracing.TracingFragment
    +

    Bases: Fragment

    +
    +
    +static get(obj: HasElaborate, platform) TracingFragment
    +

    This function code is based on Amaranth, which originally loses all information. +It was too difficult to hook into, so this has to be a near-exact copy.

    +

    Relevant copyrights apply.

    +
    + +
    +
    +prepare(*args, **kwargs) TracingFragment
    +
    + +
    +
    +subfragments: list[tuple[amaranth.hdl.ir.Elaboratable, str]]
    +
    + +
    + +
    +
    +class transactron.tracing.TracingFragmentTransformer
    +

    Bases: FragmentTransformer

    +
    +
    +on_fragment(fragment)
    +
    + +
    + +
    +
    +class transactron.tracing.TracingInstance
    +

    Bases: Instance, TracingFragment

    +
    +
    +get(platform) TracingFragment
    +

    This function code is based on Amaranth, which originally loses all information. +It was too difficult to hook into, so this has to be a near-exact copy.

    +

    Relevant copyrights apply.

    +
    + +
    + +
    +
    +

    Module contents

    +
    +
    +class transactron.Method
    +

    Bases: TransactionBase

    +

    Transactional method.

    +

    A Method serves to interface a module with external Transactions +or Methods. It can be called by at most once in a given clock cycle. +When a given Method is required by multiple Transactions +(either directly, or indirectly via another Method) simultenaously, +at most one of them is granted by the TransactionManager, and the rest +of them must wait. (Non-exclusive methods are an exception to this +behavior.) Calling a Method always takes a single clock cycle.

    +

    Data is combinationally transferred between to and from Methods +using Amaranth Records. The transfer can take place in both directions +at the same time: from the called Method to the caller (data_out) +and from the caller to the called Method (data_in).

    +

    A module which defines a Method should use body or def_method +to describe the method’s effect on the module state.

    +
    +
    Attributes
    +
    +
    name: str

    Name of this Method.

    +
    +
    ready: Signal, in

    Signals that the method is ready to run in the current cycle. +Typically defined by calling body.

    +
    +
    run: Signal, out

    Signals that the method is called in the current cycle by some +Transaction. Defined by the TransactionManager.

    +
    +
    data_in: Record, out

    Contains the data passed to the Method by the caller +(a Transaction or another Method).

    +
    +
    data_out: Record, in

    Contains the data passed from the Method to the caller +(a Transaction or another Method). Typically defined by +calling body.

    +
    +
    +
    +
    +
    +
    +__init__(*, name: Optional[str] = None, i: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = (), o: Union[Layout, Sequence[Union[Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike]], Tuple[str, Union[Shape, ShapeCastable, int, range, Type[Enum], LayoutLike], Direction]]]] = (), nonexclusive: bool = False, single_caller: bool = False)
    +
    +
    Parameters
    +
    +
    name: str or None

    Name hint for this Method. If None (default) the name is +inferred from the variable name this Method is assigned to.

    +
    +
    i: record layout

    The format of data_in. +An int corresponds to a Record with a single data field.

    +
    +
    o: record layout

    The format of data_in. +An int corresponds to a Record with a single data field.

    +
    +
    nonexclusive: bool

    If true, the method is non-exclusive: it can be called by multiple +transactions in the same clock cycle. If such a situation happens, +the method still is executed only once, and each of the callers +receive its output. Nonexclusive methods cannot have inputs.

    +
    +
    single_caller: bool

    If true, this method is intended to be called from a single +transaction. An error will be thrown if called from multiple +transactions.

    +
    +
    +
    +
    +
    + +
    +
    +body(m: ~transactron.core.TModule, *, ready: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 1'd1), out: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 0'd0)) Iterator[Record]
    +

    Define method body

    +

    The body context manager can be used to define the actions +performed by a Method when it’s run. Each assignment added to +a domain under body is guarded by the run signal. +Combinational assignments which do not need to be guarded by run +can be added to m.d.av_comb or m.d.top_comb instead of m.d.comb. +Method calls can be performed under body.

    +
    +
    Parameters
    +
    +
    mTModule

    Module in which operations on signals should be executed, +body uses the combinational domain only.

    +
    +
    readySignal, in

    Signal to indicate if the method is ready to be run. By +default it is Const(1), so the method is always ready. +Assigned combinationially to the ready attribute.

    +
    +
    outRecord, in

    Data generated by the Method, which will be passed to +the caller (a Transaction or another Method). Assigned +combinationally to the data_out attribute.

    +
    +
    +
    +
    Returns
    +
    +
    data_inRecord, out

    Data passed from the caller (a Transaction or another +Method) to this Method.

    +
    +
    +
    +
    +

    Examples

    +
    m = Module()
    +my_sum_method = Method(i = Layout([("arg1",8),("arg2",8)]))
    +sum = Signal(16)
    +with my_sum_method.body(m, out = sum) as data_in:
    +    m.d.comb += sum.eq(data_in.arg1 + data_in.arg2)
    +
    +
    +
    + +
    +
    +debug_signals() Union[Signal, Record, View, Iterable[Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]], Mapping[str, Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]]]
    +
    + +
    +
    +static like(other: Method, *, name: Optional[str] = None) Method
    +

    Constructs a new Method based on another.

    +

    The returned Method has the same input/output data layouts as the +other Method.

    +
    +
    Parameters
    +
    +
    otherMethod

    The Method which serves as a blueprint for the new Method.

    +
    +
    namestr, optional

    Name of the new Method.

    +
    +
    +
    +
    Returns
    +
    +
    Method

    The freshly constructed Method.

    +
    +
    +
    +
    +
    + +
    +
    +proxy(m: TModule, method: Method)
    +

    Define as a proxy for another method.

    +

    The calls to this method will be forwarded to method.

    +
    +
    Parameters
    +
    +
    mTModule

    Module in which operations on signals should be executed, +proxy uses the combinational domain only.

    +
    +
    methodMethod

    Method for which this method is a proxy for.

    +
    +
    +
    +
    +
    + +
    + +
    +
    +class transactron.TModule
    +

    Bases: ModuleLike, Elaboratable

    +

    Extended Amaranth module for use with transactions.

    +

    It includes three different combinational domains:

    +
      +
    • comb domain, works like the comb domain in plain Amaranth modules. +Statements in comb are guarded by every condition, including +AvoidedIf. This means they are guarded by transaction and method +bodies: they don’t execute if the given transaction/method is not run.

    • +
    • av_comb is guarded by all conditions except AvoidedIf. This means +they are not guarded by transaction and method bodies. This allows to +reduce the amount of useless multplexers due to transaction use, while +still allowing the use of conditions in transaction/method bodies.

    • +
    • top_comb is unguarded: statements added to this domain always +execute. It can be used to reduce combinational path length due to +multplexers while keeping related combinational and synchronous +statements together.

    • +
    +
    +
    +AvoidedIf(cond: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable)
    +
    + +
    +
    +Case(*patterns: str | int | enum.Enum)
    +
    + +
    +
    +Default()
    +
    + +
    +
    +Elif(cond)
    +
    + +
    +
    +Else()
    +
    + +
    +
    +FSM(reset: Optional[str] = None, domain: str = 'sync', name: str = 'fsm')
    +
    + +
    +
    +If(cond: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable)
    +
    + +
    +
    +State(name: str)
    +
    + +
    +
    +Switch(test: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable)
    +
    + +
    +
    +__init__()
    +
    + +
    +
    +property next: NoReturn
    +
    + +
    + +
    +
    +class transactron.Transaction
    +

    Bases: TransactionBase

    +

    Transaction.

    +

    A Transaction represents a task which needs to be regularly done. +Execution of a Transaction always lasts a single clock cycle. +A Transaction signals readiness for execution by setting the +request signal. If the conditions for its execution are met, it +can be granted by the TransactionManager.

    +

    A Transaction can, as part of its execution, call a number of +Methods. A Transaction can be granted only if every Method +it runs is ready.

    +

    A Transaction cannot execute concurrently with another, conflicting +Transaction. Conflicts between Transactions are either explicit +or implicit. An explicit conflict is added using the add_conflict +method. Implicit conflicts arise between pairs of Transactions +which use the same Method.

    +

    A module which defines a Transaction should use body to +describe used methods and the transaction’s effect on the module state. +The used methods should be called inside the body’s +with block.

    +
    +
    Attributes
    +
    +
    name: str

    Name of this Transaction.

    +
    +
    request: Signal, in

    Signals that the transaction wants to run. If omitted, the transaction +is always ready. Defined in the constructor.

    +
    +
    grant: Signal, out

    Signals that the transaction is granted by the TransactionManager, +and all used methods are called.

    +
    +
    +
    +
    +
    +
    +__init__(*, name: Optional[str] = None, manager: Optional[TransactionManager] = None)
    +
    +
    Parameters
    +
    +
    name: str or None

    Name hint for this Transaction. If None (default) the name is +inferred from the variable name this Transaction is assigned to. +If the Transaction was not assigned, the name is inferred from +the class name where the Transaction was constructed.

    +
    +
    manager: TransactionManager

    The TransactionManager controlling this Transaction. +If omitted, the manager is received from TransactionContext.

    +
    +
    +
    +
    +
    + +
    +
    +body(m: ~transactron.core.TModule, *, request: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 1'd1)) Iterator[Transaction]
    +

    Defines the Transaction body.

    +

    This context manager allows to conveniently define the actions +performed by a Transaction when it’s granted. Each assignment +added to a domain under body is guarded by the grant signal. +Combinational assignments which do not need to be guarded by +grant can be added to m.d.top_comb or m.d.av_comb instead of +m.d.comb. Method calls can be performed under body.

    +
    +
    Parameters
    +
    +
    m: TModule

    The module where the Transaction is defined.

    +
    +
    request: Signal

    Indicates that the Transaction wants to be executed. By +default it is Const(1), so it wants to be executed in +every clock cycle.

    +
    +
    +
    +
    +
    + +
    +
    +debug_signals() Union[Signal, Record, View, Iterable[Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]], Mapping[str, Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]]]
    +
    + +
    + +
    +
    +class transactron.TransactionContext
    +

    Bases: object

    +
    +
    +__init__(manager: TransactionManager)
    +
    + +
    +
    +classmethod get() TransactionManager
    +
    + +
    +
    +stack: list[transactron.core.TransactionManager] = []
    +
    + +
    + +
    +
    +class transactron.TransactionManager
    +

    Bases: Elaboratable

    +

    Transaction manager

    +

    This module is responsible for granting Transactions and running +Methods. It takes care that two conflicting Transactions +are never granted in the same clock cycle.

    +
    +
    +__init__(cc_scheduler: ~collections.abc.Callable[[MethodMap, dict['Transaction', set['Transaction']], set['Transaction'], dict['Transaction', int]], ~amaranth.hdl.dsl.Module] = <function eager_deterministic_cc_scheduler>)
    +
    + +
    +
    +add_transaction(transaction: Transaction)
    +
    + +
    +
    +debug_signals() Union[Signal, Record, View, Iterable[Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]], Mapping[str, Union[Signal, Record, View, Iterable[SignalBundle], Mapping[str, SignalBundle]]]]
    +
    + +
    +
    +visual_graph(fragment)
    +
    + +
    + +
    +
    +class transactron.TransactionModule
    +

    Bases: Elaboratable

    +

    TransactionModule is used as wrapper on Elaboratable classes, +which adds support for transactions. It creates a +TransactionManager which will handle transaction scheduling +and can be used in definition of Methods and Transactions.

    +
    +
    +__init__(elaboratable: HasElaborate, manager: Optional[TransactionManager] = None)
    +
    +
    Parameters
    +
    +
    elaboratable: HasElaborate

    The Elaboratable which should be wrapped to add support for +transactions and methods.

    +
    +
    +
    +
    +
    + +
    +
    +transaction_context() TransactionContext
    +
    + +
    + +
    +
    +transactron.def_method(m: ~transactron.core.TModule, method: ~transactron.core.Method, ready: amaranth.hdl.ast.Value | int | enum.Enum | amaranth.hdl.ast.ValueCastable = (const 1'd1))
    +

    Define a method.

    +

    This decorator allows to define transactional methods in an +elegant way using Python’s def syntax. Internally, def_method +uses Method.body.

    +

    The decorated function should take keyword arguments corresponding to the +fields of the method’s input layout. The **kwargs syntax is supported. +Alternatively, it can take one argument named arg, which will be a +record with input signals.

    +

    The returned value can be either a record with the method’s output layout +or a dictionary of outputs.

    +
    +
    Parameters
    +
    +
    m: TModule

    Module in which operations on signals should be executed.

    +
    +
    method: Method

    The method whose body is going to be defined.

    +
    +
    ready: Signal

    Signal to indicate if the method is ready to be run. By +default it is Const(1), so the method is always ready. +Assigned combinationally to the ready attribute.

    +
    +
    +
    +
    +

    Examples

    +
    m = Module()
    +my_sum_method = Method(i=[("arg1",8),("arg2",8)], o=[("res",8)])
    +@def_method(m, my_sum_method)
    +def _(arg1, arg2):
    +    return arg1 + arg2
    +
    +
    +

    Alternative syntax (keyword args in dictionary):

    +
    @def_method(m, my_sum_method)
    +def _(**args):
    +    return args["arg1"] + args["arg2"]
    +
    +
    +

    Alternative syntax (arg record):

    +
    @def_method(m, my_sum_method)
    +def _(arg):
    +    return {"res": arg.arg1 + arg.arg2}
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +

    © Copyright Kuźnia Rdzeni, 2023. + Last updated on 10:23 2023-10-07. +

    +
    + + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file