
This also reorganizes README to more clearly describe what nMigen is, since it was getting quite outdated.
191 lines
7.7 KiB
Markdown
191 lines
7.7 KiB
Markdown
Migen and nMigen compatibility summary
|
||
======================================
|
||
|
||
nMigen intends to provide as close to 100% compatibility to Migen as possible without compromising its other goals. However, Migen widely uses `*` imports, tends to expose implementation details, and in general does not have a well-defined interface. This document attempts to elucidate a well-defined Migen API surface (including, when necessary, private items that have been used downstream), and describes the intended nMigen replacements and their implementation status.
|
||
|
||
API change legend:
|
||
- *id*: identical
|
||
- *obs*: removed or irreversibly changed with compatibility stub provided
|
||
- *obs →n*: removed or irreversibly changed with compatibility stub provided, use *n* instead
|
||
- *brk*: removed or irreversibly changed with no replacement provided
|
||
- *brk →n*: removed or irreversibly changed with no replacement provided, use *n* instead
|
||
- *→n*: renamed to *n*
|
||
- *⇒m*: merged into *m*
|
||
- *a=→b=*: parameter *a* renamed to *b*
|
||
- *a=∼*: parameter *a* removed
|
||
- *.a=→.b*: attribute *a* renamed to *b*
|
||
- *?*: no decision made yet
|
||
|
||
When describing renames or replacements, `mod` refers to a 3rd-party package `mod` (no nMigen implementation provided), `.mod.item` refers to `nmigen.mod.item`, and "(import `.item`)" means that, while `item` is provided under `nmigen.mod.item`, it is aliased to, and should be imported from a shorter path for readability.
|
||
|
||
Status legend:
|
||
- (×) Intended replacement (the API is decided on)
|
||
- (−) Implemented replacement (the API and compatibility shim are provided)
|
||
- (+) Verified replacement and/or compatibility shim (the compatibility shim is manually reviewed and has 100% coverage)
|
||
- (∼) No direct replacement or compatibility shim is provided
|
||
|
||
Compatibility summary
|
||
---------------------
|
||
|
||
- (×) `fhdl`
|
||
- (×) `bitcontainer` ⇒ `.tools`
|
||
- (×) `log2_int` id
|
||
- (×) `bits_for` id
|
||
- (×) `value_bits_sign` → `Value.shape`
|
||
- (×) `conv_output` ?
|
||
- (×) `decorators` ⇒ `.fhdl.xfrm`
|
||
Note: `transform_*` methods not considered part of public API.
|
||
- (∼) `ModuleTransformer` **brk**
|
||
- (∼) `ControlInserter` **brk**
|
||
- (×) `CEInserter` id, `clock_domains=`→`controls=`
|
||
- (×) `ResetInserter` id, `clock_domains=`→`controls=`
|
||
- (×) `ClockDomainsRenamer` → `DomainRenamer`, `cd_remapping=`→`domain_map=`
|
||
- (∼) `edif` **brk**
|
||
- (×) `module` **obs** → `.fhdl.dsl`
|
||
- (×) `FinalizeError` **obs**
|
||
- (×) `Module` **obs** → `.fhdl.dsl.Module`
|
||
- (∼) `namer` **brk**
|
||
- (×) `simplify` ?
|
||
- (×) `FullMemoryWE` ?
|
||
- (×) `MemoryToArray` ?
|
||
- (×) `SplitMemory` ?
|
||
- (×) `specials` **obs**
|
||
- (×) `Special` ?
|
||
- (×) `Tristate` ?
|
||
- (×) `TSTriple` → `.genlib.io.TSTriple`, `bits_sign=`→`shape=`
|
||
- (×) `Instance` ?
|
||
- (×) `READ_FIRST`/`WRITE_FIRST`/`NO_CHANGE` ?
|
||
- (×) `_MemoryPort` ?
|
||
- (×) `Memory` ?
|
||
- (×) `structure` → `.fhdl.ast`
|
||
- (×) `DUID` id
|
||
- (×) `_Value` → `Value`
|
||
Note: values no longer valid as keys in `dict` and `set`; use `ValueDict` and `ValueSet` instead.
|
||
- (×) `wrap` → `Value.wrap`
|
||
- (×) `_Operator` → `Operator`
|
||
- (×) `Mux` → `Mux`
|
||
- (×) `_Slice` → `Slice`, `stop=`→`end=`, `.stop`→`.end`
|
||
- (×) `_Part` → `Part`
|
||
- (×) `Cat` id, `.l`→`.operands`
|
||
- (×) `Replicate` → `Repl`, `v=`→`value=`, `n=`→`count=`, `.v`→`.value`, `.n`→`.count`
|
||
- (×) `Constant` → `Const`, `bits_sign=`→`shape=`
|
||
- (×) `Signal` id, `bits_sign=`→`shape=`, `attr=`→`attrs=`, `name_override=`∼, `related=`, `variable=`∼
|
||
- (×) `ClockSignal` id, `cd=`→`domain=`
|
||
- (×) `ResetSignal` id, `cd=`→`domain=`
|
||
- (×) `_Statement` → `Statement`
|
||
- (×) `_Assign` → `Assign`, `l=`→`lhs=`, `r=`→`rhs=`
|
||
- (×) `_check_statement` **obs** → `Statement.wrap`
|
||
- (×) `If` **obs** → `.fhdl.dsl.Module.If`
|
||
- (×) `Case` **obs** → `.fhdl.dsl.Module.Switch`
|
||
- (×) `_ArrayProxy` ?
|
||
- (×) `Array` ?
|
||
- (×) `ClockDomain` → `.fhdl.cd.ClockDomain`
|
||
- (×) `_ClockDomainList` ?
|
||
- (×) `SPECIAL_INPUT`/`SPECIAL_OUTPUT`/`SPECIAL_INOUT` ?
|
||
- (∼) `_Fragment` **brk** → `.fhdl.ir.Fragment`
|
||
- (×) `tools` **brk**
|
||
- (×) `list_signals` ?
|
||
- (×) `list_targets` ?
|
||
- (×) `list_inputs` ?
|
||
- (×) `group_by_targets` ?
|
||
- (∼) `list_special_ios` **brk**
|
||
- (∼) `list_clock_domains_expr` **brk**
|
||
- (×) `list_clock_domains` ?
|
||
- (×) `is_variable` ?
|
||
- (∼) `generate_reset` **brk**
|
||
- (∼) `insert_reset` **brk**
|
||
- (∼) `insert_resets` **brk** → `.fhdl.xfrm.ResetInserter`
|
||
- (∼) `lower_basics` **brk**
|
||
- (∼) `lower_complex_slices` **brk**
|
||
- (∼) `lower_complex_parts` **brk**
|
||
- (∼) `rename_clock_domain_expr` **brk**
|
||
- (∼) `rename_clock_domain` **brk** → `.fhdl.xfrm.DomainRenamer`
|
||
- (∼) `call_special_classmethod` **brk**
|
||
- (∼) `lower_specials` **brk**
|
||
- (×) `tracer` **brk**
|
||
- (×) `get_var_name` ?
|
||
- (×) `remove_underscore` ?
|
||
- (×) `get_obj_var_name` ?
|
||
- (×) `index_id` ?
|
||
- (×) `trace_back` ?
|
||
- (×) `verilog`
|
||
- (×) `DummyAttrTranslate` ?
|
||
- (×) `convert` **obs** → `.back.verilog.convert`
|
||
- (∼) `visit` **brk** → `.fhdl.xfrm`
|
||
- (∼) `NodeVisitor` **brk**
|
||
- (∼) `NodeTransformer` **brk** → `.fhdl.xfrm.ValueTransformer`/`.fhdl.xfrm.StatementTransformer`
|
||
- (×) `genlib`
|
||
- (×) `cdc` ?
|
||
- (×) `MultiRegImpl` ?
|
||
- (×) `MultiReg` id
|
||
- (×) `PulseSynchronizer` ?
|
||
- (×) `BusSynchronizer` ?
|
||
- (×) `GrayCounter` ?
|
||
- (×) `GrayDecoder` ?
|
||
- (×) `ElasticBuffer` ?
|
||
- (×) `lcm` ?
|
||
- (×) `Gearbox` ?
|
||
- (×) `coding` ?
|
||
- (×) `Encoder` ?
|
||
- (×) `PriorityEncoder` ?
|
||
- (×) `Decoder` ?
|
||
- (×) `PriorityDecoder` ?
|
||
- (×) `divider` ?
|
||
- (×) `Divider`
|
||
- (×) `fifo` ?
|
||
- (×) `SyncFIFO` ?
|
||
- (×) `SyncFIFOBuffered` ?
|
||
- (×) `AsyncFIFO` ?
|
||
- (×) `AsyncFIFOBuffered` ?
|
||
- (×) `_FIFOInterface` ?
|
||
- (×) `fsm` **obs**
|
||
- (×) `AnonymousState` **obs**
|
||
- (×) `NextState` **obs**
|
||
- (×) `NextValue` **obs**
|
||
- (×) `_LowerNext` **obs**
|
||
- (×) `FSM` **obs**
|
||
- (×) `io` ?
|
||
- (×) `DifferentialInput` ?
|
||
- (×) `DifferentialOutput` ?
|
||
- (×) `CRG` ?
|
||
- (×) `DDRInput` ?
|
||
- (×) `DDROutput` ?
|
||
- (×) `misc` ?
|
||
- (×) `split` ?
|
||
- (×) `displacer` ?
|
||
- (×) `chooser` ?
|
||
- (×) `timeline` ?
|
||
- (×) `WaitTimer` ?
|
||
- (×) `BitSlip` ?
|
||
- (×) `record` ?
|
||
- (×) `DIR_NONE` ?
|
||
- (×) `DIR_S_TO_M` ?
|
||
- (×) `DIR_M_TO_S` ?
|
||
- (×) `set_layout_parameters` ?
|
||
- (×) `layout_len` ?
|
||
- (×) `layout_get` ?
|
||
- (×) `layout_partial` ?
|
||
- (×) `Record` ?
|
||
- (×) `resetsync` ?
|
||
- (×) `AsyncResetSynchronizer` ?
|
||
- (×) `roundrobin` ?
|
||
- (×) `SP_WITHDRAW` ?
|
||
- (×) `SP_CE` ?
|
||
- (×) `RoundRobin` ?
|
||
- (×) `sort` ?
|
||
- (×) `BitonicSort` ?
|
||
- (×) `sim` **obs** → `.back.pysim`
|
||
- (∼) `core` **brk**
|
||
- (∼) `vcd` **brk** → `vcd`
|
||
Note: only items directly under `nmigen.compat.sim`, not submodules, are provided.
|
||
- (×) `Simulator` **brk**
|
||
- (×) `run_simulation` **obs** → `.back.pysim.Simulator`
|
||
- (×) `passive` **obs** → `.fhdl.ast.Passive`
|
||
- (×) `build` ?
|
||
- (×) `util` **obs**
|
||
- (×) `misc` ⇒ `.tools`
|
||
- (×) `flat_iteration` → `.flatten`
|
||
- (∼) `xdir` **brk**
|
||
- (∼) `gcd_multiple` **brk**
|
||
- (∼) `treeviz` **brk**
|