Whats resonable to express, how this relates to hardware Catch-all? Can always use black boxes Read/write ports? explicitly call it out in front end, and have a r/w accessor Can infer from enables that they are mutually exclusive in some cases, in general need SAT solver Writer often wants a r/w port to always be generated r/w ports are always synchronous because writes always synchronous Example of read/write to same address, can handle differently in BRAM's on FPGA, but is undefined for SRAMs. (Specifically for Synchronous). In this case, it is backend speciifc, so should not be in chisel code. Don't have both synchronous and asynchronous reads on the same memory Declaring the memory itself to have delay? - have node for seq, and node for combinational. Could have >1 delay, but not often used. Boolean for now (0 or 1) Absorbing registers should stop - register the address input, and chisel is allowed to retime the register into the address Not firrtl's job to autotune - that is the library writer (ASIC backend? FIRRTL library?) e.g. FPGA backend is an executable that iterates and does DSE Masks? Front-end generates mem's of type bundles or vec for enable granularity. Lowering does not expand these. Backends treat these differently. How do we do this? Try not expanding mems, but expanding accessors. e.g. mem m : { tag : UInt<10> data : UInt<128> }[128] accessor r = m[i] accessor w = m[i] ==> mem m : { tag : UInt<10> data : UInt<128> }[128] accessor r#tag = m.tag[i] accessor r#data = m.data[i] accessor w#tag = m.tag[i] accessor w#data = m.data[i] Eliminate flips from bundles in mems, must error.