From 4e61dee086d3f77cf60a852353dff26cf21d58b1 Mon Sep 17 00:00:00 2001 From: Spence Konde Date: Sun, 8 Oct 2023 06:02:02 -0400 Subject: [PATCH] More logic docs! --- megaavr/libraries/Logic/LUTFeedback.png | Bin 0 -> 45819 bytes megaavr/libraries/Logic/Tricks_and_Tips.md | 296 +++++++++++++++------ 2 files changed, 221 insertions(+), 75 deletions(-) create mode 100644 megaavr/libraries/Logic/LUTFeedback.png diff --git a/megaavr/libraries/Logic/LUTFeedback.png b/megaavr/libraries/Logic/LUTFeedback.png new file mode 100644 index 0000000000000000000000000000000000000000..6fadc315d575472ad40dfc37f3fbc2d5bbaa92be GIT binary patch literal 45819 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 literal 0 HcmV?d00001 diff --git a/megaavr/libraries/Logic/Tricks_and_Tips.md b/megaavr/libraries/Logic/Tricks_and_Tips.md index 599a66ae..b809d4e4 100644 --- a/megaavr/libraries/Logic/Tricks_and_Tips.md +++ b/megaavr/libraries/Logic/Tricks_and_Tips.md @@ -26,12 +26,7 @@ Sometimes you need a pulse when all you have is a level. This gets you there. Th This is one of the really cool, repurposable features. The intended use is that you can use the synchronizer to take a 2 clock cycle delay to ensure clean transitions and prevent glitches, with the filter meant to provide a means of cleanly handling more substantial noise by requiring that the signal be unchanged for 4 CCL clocks before outputting it. One nuisance is that according to the datasheet, one of these settings must be enabled to use the synchronizer. ### The sequencer -The sequencer, in some modes, also uses the clock. It takes the clock from the EVEN LUT when acting as a flip-flop (but not when acting as a latch). - -### Ideas for application -Imagine you wanted a slightly longer pulse from a level change - say, 2 or 4 clocks clocks - than edge detector can get you. So you take a pair of LUTs, and enable the sequencer, with an R/S latch selected. Configure both of them identically. The one on the S line gets the synchronizer, and the one on the R line gets the filter. Result? When the inputs match the truth table, the signal will make it's way through the 2 stages of the synchronizer on both LUTs. This will set the sequencer output. Two clocks after that, the signal will make it through the second LUT and reset the sequencer. - -Or you can skip the sequencer, run the higher numbered LUT in level mode to interpret the inputs, and the adjacent one to make a pulse. You'd get 2 or 4 clock long pulse from it - but **that clock can be a different clock from the first one**. +The sequencer, in some modes, also uses the clock. It takes the clock from the EVEN LUT when acting as a flip-flop (but not when acting as a latch - the latch isn't clocked). ### The signal proceeds through a logic block's subcomponents in an order It's important to understand the signal path. @@ -171,6 +166,86 @@ Clock: N/A for latch, anything except IN2 as clock as demanded by application fo Sync/Filter: Off for latch, on for flip-flop. + +### Pulse-stretcher +You often need pulses output on pins or to direct internal peripherals via the event system. Maybe you have an input that generates fast pulses, but you need a long enough pulse for a synchronous peripheral to react to, or maybe you'd like to generate a pulse from software, and then immediately write to another pin *during* the pulse, because that would make some bigbanged mess cleaner (I doubt it will, but feel free to try). + +#### Even LUT: +Start with the even LUT set to act as an S/R latch as described above. + +INSEL: +* Set: Pulse input +* Reset: Link +* Feedback + +LUT per above. + +#### Odd LUT: +The odd lut is a simple delay. + +INSEL: +X: Feedback (from Even LUT) +Y: Masked +Z: Clock or Masked + +LUT: 0x02 + +Clock: Anything that 2 or 4 ticks of will be a long enough pulse. + +Sync/Filter: Sync to stretch any pulse on the input to 2 CLKodd, filter for 4 CLKodd. + +Edge detector: No + +This combination does the following: +1. Input signal sets the LUT acting as an SR latch. This generates the undelayed pulse output. +2. Delay LUT has the sync/filter on, and possibly a slower clock source than the system clock, and sync or filter is on, so this slows the signal down. +3. 2 or 4 clocks later, the output of the second LUT goes high. This resets the LUT as SR latch, and also gives you a delayed pulse you may need. +4. 2 or 4 clocks after that, reset goes low and and the mechanism is ready for the next pulse +5. You might be tempted to use an edge detector on the delay LUT for faster recovery time. This is not safe. If an incoming pulse beats your recovery time, you can end up with a wedged mechanism that can't be readily unwedged; consider this sequence of events: + a. Input pulse sets SR latch, starting pulse output + b. delay lut delays, and then generates a pulse + c. Another input pulse arrives during the stretched pulse - starting either before or during that reset pulse, but ending after the reset pulse ends. + e. There are three ways to handle the contradictory inputs. None of them work. If you set output low, the output will go low, but as soon as it goes away, set is still high, so the output is set once more. But the the brief low output could be missed by the synchronizer. This in turn would mean no reset pulse. If we set high on both, it's guaranteed not reset any time this happens. And maintaining the previous level just mirrors one of those. No matter what, there's a chance you won't get any more reset pulses whenever your recovery time is missed. +6. Without an edge detector, it depends on what behavior you want, specifically how you want to deal with a signal that occurs during your recovery time. + +| On cont. inputs go | Throughout reset | During and after | Before and during | +|--------------------|------------------|------------------|-------------------| +| Low | Pulse ends on
time, one pulse length
after end, 2nd pulse | Pulse ends on
time, one pulse length
after end, 2nd pulse | Second pulse ignored. | +| High | Pulse extra long
, No second pulse | Pulse ends on
time, second pulse
starts immediately | First pulse lasts until
second input ends | +| Maintain | As high, above. | As low, above | As high, above. | + + + +### Pulse Stretcher 2 +This uses the sequencer. It doesn't get you the delayed pulse. However, it is largely free of complications. + +#### Even LUT: +Even LUT drives set. + +INSEL: +* X: Pulse input +* Y: Link (they say you can't have S and R high on the SR latch (and we don't get to pick behavior there like we did. )) +* Masked + +LUT 0x02 + +#### Odd LUT: +The odd lut drives reset, much like the one above did. + +INSEL: +X: Feedback (from Sequencer) +Y: Masked +Z: Clock or Masked + +LUT: 0x02 + +Clock: Anything that 2 or 4 ticks of will be a long enough pulse + +Sync/Filter: Sync to stretch any pulse on the input to 2 CLKodd, filter for 4 CLKodd + +Sequencer: S/R latch + + ## More patterns ### A/B select @@ -234,13 +309,82 @@ Clock: N/A Sync/Filter: Off +### Buffer (0 clock delay), 2 clock delay or 4 clock delay for level events +Without the synchronizer or prescaler, this is just a buffer (which is far from useless - you can use a LUT with this truth table and no synchronizer to get a level event onto a pin; For example, if you're on a 14-pin DD series. You've got the 3 PWM outputs coming from PC1-3, and the two TCD's on PD6 and PD7, you can't get any more PWM channels directly. If you're on a 14-pin tiny, and you've taken over TCA0 to do the 16-bit PWM that you need (TCA0 event output only works in SINGLE mode, not SPLIT mode, supposedly. I should probably check that the WO outputs aren't actually still being fed - that would make this trick go from niche to "widely useful", because any time that the pin on the low half of a TCA is used or missing, you could reclaim the PWM channels this way.) + +INSEL: +* X: Input +* Y: Masked +* Z: Masked or used for clock source. Input signals are delayed 0, 2 or 4 of these clocks. + +LUT: +* 000: 0 +* 001: 1 + +TRUTH = 0x02 + +Clock: Whichever clock source will give you the delay that you need. This is CLKodd. + +Sync/Filter: Off - 0 clock delay (buffer), Sync (2 clock delay) or Filter (4 clock delay, plus filtering). + +Note that with sync/filter off, the delay is not zero, obviously, but the response time is significantly faster than the system clock. Not only that, but these two methods of setting up the buffer will give slightly different times: + +1. Pin input -> Event channel -> CCL -> Pin output +2. Pin input -> CCL -> Pin output + +This was investigated a while back using the much more convenient sandbox of a LUT oscillator (set to invert it's own output with no sync/filter) +3. CCL -> CCL -> CCL -> Pin output +4. CCL -> Event channel -> CCL -> Pin output +5. CCL output -> CCL -> Pin output +6. CCL -> Event channel -> CCL -> CCL -> Pin output. + +In the second case, the idea was to exclude everything except the propagation time of the signal in the chip. It will oscillate, allowing a scope to be used to measure the frequency (hence the meaningful measure, the propagation delay). Note that bandwidth limiting needs to be off - scopes often are designed to attenuate signals above 20 MHz, and this is typically turned on by default. You usually want it on because it reduces the visiblity of any high frequency noise that might be obscuring the signal, but not if you're looking at a signal above the ceiling (which this will be)). + +When I tested it, 3 (lut pair, odd one takes the feedback as input, even one takes LINK as input, one echoes input unchanges (TRUTH=2) and the other inverts it (TRUTH=1). and 4 (odd lut, feeding an event channel used as it's input) generated the same frequency iirc, but 5 (even lut inverting own output) resulted in output twice as fast. Variant 6 (non-paired, consecutive luts, ie, first stage on LUT2, second on LUT1. LUT1 can take output from LUT2 via link, but to get it's output back to LUT2 needs an event channel) had a third the frequency of variant 5. The frequency of variant 5 was in the area of 80-100 MHz (!!!), indicating a propagation time per stage of 10-12ns (depending on temperature - dFLUT OSC/dT is orders of magnitude larger than dFInt. 20 MHz OSC/dT). I do not know what the speed of cases 1 and 2 are - but I predict that t1 = A t5, t2 = (A + B)t5, and that the values of A, B are either (2, 1), (2,2) or (3,2), and I think it's 2, 1. + +### 2 LUT edge detector for RISING *or* FALLING +This generates a pulse two or four clocks long on either a rising *or* falling edge. + +We need 2 LUTs, n, and n+1, where n is an even number. + +#### LUTn+1: Configure for 2 or 4 clock delay as above. +See also variant below. The first stage is just generating a delayed version of the input waveform. + +#### LUTn +Then we take the input, and xor it with the delayed input, and output that. +INSEL: +* X: Input +* Y: LINK +* Z: Masked + +LUT: +* 000: 0 +* 001: 1 +* 010: 1 +* 011: 0 +TRUTH = 0x06 + +Clock: N/A (typically) + +Sync/Filter: (typically - can be used to delay the pulse slightly) + +#### Variant: Lightning fast pulses +Using an input that is available through both the event system and directly (say, LUT0's PA1 input, which LUT0 can use directly, but LUT1 would need to get it through the event channel, and turn off sync/filter. The event channel (I belive) adds 1 propagation delay to the input on LUT1, which immediately switches it's output and that arrives at LUT0 through link 1 propagation time later) This adds a delay of 1 propagation time, and the CCL itself adds another. In this configuration like that you would get pulses of 20-25 ns duration whenever the input transitioned. Is this of much use? Doubtful - but it's useful to consider this limiting case. + +#### Review - what determines what +There are two parameters needed to describe the behavior of this configuration - the delay between the rising edge of the input and the rising edge of the output is 1 propagation time (negligible almost all of the time), unless the filter or synchronizer of the EVEN lut is enabled, in which case that delay will be 2 or 4 CLKeven. The length of the pulse is determined by CLKodd if the sync or filter are enabled - since the output is high when the inputs are different, a delay in the first stage manifests as the length of the pulse, and thus is 2 or 4 CLKodd. If the synchronizer or filter on the EVEN lut are used to delay the start of the pulse, F_CLKeven must be >= F_CLKodd to avoid misbehavior, however, it may be as fast as you like within the limits of the hardware. + +**Tip:** The AVR EB-series is coming with a very powerful PLL (for an AVR! But it seriously does: 8x or 16x multiply, 1, 2, 4 or 6 input divider, then an optional 2:1 divider on the output, and somewhere there's a prescaler B that divides something by 4 if you want. I don't know what and won't until we get the datasheet). And guess what - You can clock the CCL with it! So that's something to look forward to on the EB! For some of us, possibly the only thing, but let's not dwell on the negative. + ## Prescaling clocks with the CCL You can use CCL logic blocks to prescale a clock, albeit inefficiently. On parts with 6 LUTs, you can prescale by 2^18 if you're willing to use all LUTs and 3 event channels. This can be used for example to clock a TCB from a prescaled value that is slower than half the system clock but not used by any TCA. Generally, I would argue that if you're using more than 3 LUTs, you should consider whether there is any other way to achieve your goal. -## The general scheme +**Tip:** This will be way more powerful on the EB, for the reasons described in the tip at the end of the previous section. + +### The general scheme 1. Find the prescaling factor you want on the table below. 2. Check the LUTS and EVENTS columns and make sure you have that many available. @@ -253,73 +397,75 @@ Generally, I would argue that if you're using more than 3 LUTs, you should consi b. If the number under the column with the LUT number heading (0-5) is a 4, the "filter/synchronizer" should be set as synchronizer. c. If the number is an 8, it should be set as a filter. d. The highest number LUT should use the system clock (or other clock to be prescaled. - e. If the operation is ADD, ADD2, ADD2MUL3, ADD4, or ADD4MUL5, set input 0 that lut to link, and the truth table to 0x02. (output a 1 when input is 1) - f. If the operation in mul, set input 0 to be feedback (if even) or an event channel carrying it's own output (if odd), and input 2 to link (unless it's the highest lut), - g. The highest LUT, and any luts multiplying the previous one, should get a truth table of 0x01 (output a 1 when input is 0). - - - -## The giant table - -| Total | p0 | 0 | 1 | oppr 0 | oppr 1 | p2+3 | p2 | 2 | 3 | oppr 2 | oppr 3 | p3 | 4 | 5 | op4 | LUTS | Events | -|-------|----|---|---|-----------|-----------|------|----|---|---|-----------|-----------|----|---|---|-----|------|--------| -| 4 | 4 | 4 | - | - | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | -| 8 | 8 | 4 | - | - | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | -| 12 | 12 | 4 | 8 | ADD | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | -| 16 | 16 | 8 | 8 | ADD | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | -| 20 | 16 | 4 | 4 | ADD2 | ADD | - | 4 | 4 | - | ADD | - | - | - | - | - | 3 | 1 | -| 24 | 16 | 4 | 4 | ADD2 | ADD | - | 8 | 8 | - | ADD | - | - | - | - | - | 3 | 1 | -| 28 | 8 | 4 | 4 | ADD | ADD | 20 | 8 | 4 | 4 | ADD | ADD | 12 | 4 | 8 | ADD | 6 | 0 | -| 32 | 32 | 4 | 8 | MUL | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | -| 36 | 8 | 4 | 4 | ADD | ADD | 28 | 12 | 4 | 8 | ADD | ADD | 16 | 8 | 8 | ADD | 6 | 0 | -| 40 | 8 | 4 | 4 | ADD | ADD | 32 | 16 | 8 | 8 | ADD | ADD | 16 | 8 | 8 | ADD | 6 | 0 | -| 44 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | * | 4 | 8 | ADD | - | - | - | - | - | 4 | 2 | -| 48 | 16 | 4 | 4 | ADD2 | ADD | - | 32 | 4 | - | ADD | ADD4MUL5 | * | 4 | 4 | - | 5 | 1 | -| 52 | 32 | 4 | 8 | MUL | ADD | - | 16 | 4 | 4 | MUL | ADD4 | 4 | 4 | - | - | 5 | 1 | -| 64 | 64 | 8 | 8 | MUL | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | -| 76 | 12 | 4 | 8 | ADD | ADD | 64 | 8 | 4 | 4 | ADD | MUL | 8 | 4 | 4 | ADD | 6 | 0 | -| 80 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | - | - | - | - | - | 4 | 2 | -| 84 | 64 | 8 | 8 | MUL | ADD | - | 16 | 8 | 8 | ADD | ADD4 | 4 | 4 | - | - | 5 | 1 | -| 88 | 8 | 4 | 4 | ADD | ADD2MUL3 | - | * | 4 | 4 | ADD | ADD4MUL5 | * | 4 | 4 | - | 6 | 1 | -| 96 | 8 | 4 | 4 | ADD | ADD | - | 12 | 4 | 8 | ADD | MUL4 | 4 | 4 | - | - | 5 | 1 | -| 100 | 64 | 8 | 8 | MUL | ADD | - | 32 | 4 | 8 | MUL | ADD4 | 4 | 4 | - | - | 5 | 1 | -| 108 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | * | 4 | 8 | ADD | ADD4MUL5 | * | 4 | 4 | ADD | 6 | 1 | -| 128 | 16 | 4 | 4 | MUL2 | MUL | - | 8 | 8 | 1 | MUL | - | - | - | - | - | 3 | 1 | -| 140 | 12 | 4 | 8 | ADD | ADD | 128 | 16 | 8 | 8 | ADD | MUL | 8 | 4 | 4 | ADD | 6 | 0 | -| 144 | 12 | 4 | 8 | ADD | MUL | - | 12 | 4 | 8 | ADD | - | - | - | - | - | 4 | 1 | -| 152 | 8 | 4 | 4 | ADD | ADD2MUL3 | - | * | 4 | 4 | ADD | ADD4MUL5 | * | 4 | 8 | - | 6 | 1 | -| 160 | 8 | 4 | 4 | ADD | MUL | - | 12 | 4 | 8 | ADD | ADD4 | 4 | 8 | - | - | 5 | 1 | -| 172 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | - | 4 | 8 | ADD | ADD4MUL5 | * | 4 | 8 | - | 6 | 1 | -| 192 | 16 | 8 | 8 | ADD | MUL | - | 12 | 4 | 8 | ADD | - | - | - | - | - | 4 | 1 | -| 204 | 12 | 4 | 8 | ADD | ADD | 192 | 16 | 8 | 8 | ADD | MUL | 12 | 4 | 8 | ADD | 6 | 0 | -| 208 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | ADD4MUL5 | * | 4 | 4 | - | 6 | 1 | -| 224 | 32 | 4 | 8 | MUL | ADD | 192 | 16 | 8 | 8 | ADD | MUL | 12 | 4 | 8 | ADD | 6 | 0 | -| 256 | 16 | 4 | 4 | MUL | MUL | - | 16 | 4 | 4 | MUL | - | - | - | - | - | 4 | 1 | -| 268 | 12 | 4 | 8 | ADD | ADD | 256 | 16 | 8 | 8 | ADD | MUL | 16 | 8 | 8 | ADD | 6 | 0 | -| 288 | 12 | 4 | 8 | ADD | MUL | - | 16 | 8 | 8 | ADD | ADD4 | 8 | 8 | - | - | 5 | 1 | -| 300 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | * | 4 | 8 | ADD | ADD4MUL5 | * | 8 | 8 | - | 6 | 2 | -| 336 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | ADD4MUL5 | * | 4 | 8 | - | 6 | 2 | -| 384 | 16 | 8 | 8 | ADD | MUL | - | 16 | 4 | 4 | MUL | ADD4 | 8 | 8 | - | - | 5 | 1 | -| 512 | 64 | 8 | 8 | MUL | ADD | - | 16 | 8 | 8 | ADD | MUL4 | 4 | 4 | - | - | 5 | 1 | -| 576 | 12 | 4 | 8 | ADD | MUL | 48 | 32 | 4 | 8 | MUL | ADD | 16 | 4 | 4 | MUL | 6 | 2 | -| 592 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | ADD4MUL5 | * | 8 | 8 | - | 6 | 1 | -| 640 | 16 | 4 | 4 | MUL | MUL | - | 32 | 4 | 8 | MUL | ADD4 | 8 | 8 | - | - | 5 | 2 | -| 768 | 12 | 4 | 8 | ADD | MUL | 64 | 32 | 4 | 8 | MUL | ADD | 32 | 4 | 8 | MUL | 6 | 2 | -| 1024 | 32 | 4 | 8 | MUL | MUL | - | 32 | 4 | 8 | MUL | - | - | - | - | - | 4 | 2 | -| 1088 | 16 | 4 | 4 | MUL2 | MUL | - | 68 | 8 | 8 | MUL | ADD4MUL5 | * | 8 | 4 | MUL | 5 | 3 | -| 1152 | 12 | 4 | 8 | ADD | MUL | - | 16 | 8 | 8 | ADD | MUL4 | 8 | 8 | - | - | 5 | 1 | -| 1280 | 16 | 4 | 4 | MUL | MUL | 80 | 16 | 4 | 4 | MUL | ADD | 64 | 8 | 8 | MUL | 6 | 2 | -| 1536 | 16 | 8 | 8 | ADD | MUL | - | 16 | 4 | 4 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | -| 2048 | 16 | 4 | 4 | MUL | MUL | - | 32 | 4 | 8 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | -| 2304 | 32 | 4 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | ADD4 | 8 | 8 | - | - | 5 | 2 | -| 4096 | 64 | 8 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | - | - | - | - | - | 4 | 2 | -| 4608 | 64 | 8 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | ADD4 | 12 | 8 | 4 | ADD | 5 | 2 | -| 8192 | 32 | 4 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | -| 16384 | 16 | 8 | 8 | ADD | MUL | 1024 | 32 | 4 | 8 | MUL | MUL | 32 | 4 | 8 | MUL | 6 | 2 | -| 24576 | 12 | 4 | 8 | ADD | MUL | 2048 | 32 | 4 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 2 | -| 32768 | 64 | 8 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | -| 65536 | 16 | 8 | 8 | ADD | MUL | 4096 | 64 | 8 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 3 | -|131072 | 64 | 8 | 8 | MUL | MUL | 2048 | 32 | 4 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 3 | -|262144 | 64 | 8 | 8 | MUL | MUL | 4096 | 64 | 8 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 3 | + e. If the operation is ADD set input 0 that lut to link, and the truth table to 0x02. (output a 1 when input is 1) + f. If the operation in MUL set input 0 to be feedback (if even) or an event channel carrying it's own output (if odd), and input 2 to link (unless it's the highest lut). + g. If the operation is ADDn, ADDnMULn+1, or MULn - Uh, I forget what exactly these translated into. + h. The highest LUT, and any luts multiplying the previous one, should get a truth table of 0x01 (output a 1 when input is 0). + i. Take the table with a spoonful of salt. I found several errors in a short time looking at it. + +### The giant table + +| Total | p0 | 0 | 1 | oppr 0 | oppr 1 | p2+3 | p2 | 2 | 3 | oppr 2 | oppr 3 | p3 | 4 | 5 | op4 | LUTS | Events | Warning | +|-------|----|---|---|-----------|-----------|------|----|---|---|-----------|-----------|----|---|---|-----|------|--------|---------| +| 4 | 4 | 4 | - | FIRST | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | | +| 8 | 8 | 4 | - | FIRST | - | - | - | - | - | - | - | - | - | - | - | 2 | 0 | | +| 12 | 12 | 4 | 8 | ADD | FIRST | - | - | - | - | - | - | - | - | - | - | 2 | 0 | | +| 16 | 16 | 8 | 8 | ADD | FIRST | - | - | - | - | - | - | - | - | - | - | 2 | 0 | | +| 20 | 16 | 8 | 8 | ADD | ADD | - | 4 | 4 | - | FIRST | - | - | - | - | - | 3 | 1 | | +| 24 | 16 | 4 | 4 | ADD2 | ADD | - | 8 | 8 | - | FIRST | - | - | - | - | - | 3 | 1 | | +| 28 | 16 | 8 | 8 | ADD | ADD | - | 12 | 8 | 4 | ADD | FIRST | - | - | - | - | 4 | 0 | | +| 32 | 32 | 4 | 8 | MUL | FIRST | - | - | - | - | - | - | - | - | - | - | 2 | 0 | | +| 36 | 4 | - | 4 | - | ADD | - | 32 | 8 | 4 | MUL | FIRST | - | - | - | - | 3 | 1 | ODD LOW | +| 40 | 8 | - | 8 | - | ADD | - | 32 | 8 | 4 | MUL | FIRST | - | - | - | - | 3 | 1 | ODD LOW | +| 44 | 12 | 4 | 8 | ADD | ADD | - | 32 | 8 | 4 | MUL | FIRST | - | - | - | - | 4 | 2 | | +| 48 | 16 | 8 | 8 | ADD | ADD | - | 32 | 8 | 4 | MUL | FIRST | - | - | - | - | 4 | 1 | | +| 52 | 32 | 4 | 8 | MUL | ADD | - | 16 | 4 | 4 | MUL | ADD4 | 4 | 4 | - | FST | 5 | 1 | | +| 64 | 64 | 8 | 8 | MUL | FIRST | - | - | - | - | - | - | - | - | - | - | 2 | 0 | | +| 68 | 4 | - | 4 | - | ADD | - | 64 | 8 | 8 | MUL | FIRST | - | - | - | - | 3 | 1 | ODD LOW | +| 72 | 4 | - | 8 | - | ADD | - | 64 | 8 | 8 | MUL | FIRST | - | - | - | - | 3 | 1 | ODD LOW | +| 76 | 4 | 4 | 8 | ADD | ADD | - | 64 | 8 | 8 | MUL | FIRST | - | - | - | - | 4 | 1 | | +| 80 | 4 | 8 | 8 | ADD | ADD | - | 64 | 8 | 8 | MUL | FIRST | - | - | - | - | 4 | 1 | | +| 84 | 64 | 8 | 8 | MUL | ADD | - | 16 | 8 | 8 | ADD | ADD4 | 4 | 4 | - | FST | 5 | 1 | | +| 88 | 8 | 4 | 4 | ADD | ADD2MUL3 | - | * | 4 | 4 | ADD | ADD4MUL5 | * | 4 | 4 | - | 6 | 1 | | +| 96 | 8 | 4 | 4 | ADD | ADD | - | 12 | 4 | 8 | ADD | MUL4 | 4 | 4 | - | - | 5 | 1 | | +| 100 | 64 | 8 | 8 | MUL | ADD | - | 32 | 4 | 8 | MUL | ADD4 | 4 | 4 | - | - | 5 | 1 | | +| 108 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | * | 4 | 8 | ADD | ADD4MUL5 | * | 4 | 4 | ADD | 6 | 1 | | +| 128 | 16 | 4 | 4 | MUL2 | MUL | - | 8 | 8 | - | FIRST | - | - | - | - | - | 3 | 1 | | +| 140 | 12 | 4 | 8 | ADD | ADD | 128 | 16 | 8 | 8 | ADD | MUL | 8 | 4 | 4 | ADD | 6 | 0 | | +| 144 | 12 | 4 | 8 | ADD | MUL | - | 12 | 4 | 8 | ADD | FIRST | - | - | - | - | 4 | 1 | | +| 152 | 8 | 4 | 4 | ADD | ADD2MUL3 | - | * | 4 | 4 | ADD | ADD4MUL5 | * | 4 | 8 | - | 6 | 1 | | +| 160 | 8 | 4 | 4 | ADD | MUL | - | 12 | 4 | 8 | ADD | ADD4 | 4 | 8 | - | - | 5 | 1 | | +| 172 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | - | 4 | 8 | ADD | ADD4MUL5 | * | 4 | 8 | - | 6 | 1 | | +| 192 | 16 | 8 | 8 | ADD | MUL | - | 12 | 4 | 8 | ADD | FIRST | - | - | - | - | 4 | 1 | | +| 204 | 12 | 4 | 8 | ADD | ADD | 192 | 16 | 8 | 8 | ADD | MUL | 12 | 4 | 8 | ADD | 6 | 0 | | +| 208 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | ADD4MUL5 | * | 4 | 4 | - | 6 | 1 | | +| 224 | 32 | 4 | 8 | MUL | ADD | 192 | 16 | 8 | 8 | ADD | MUL | 12 | 4 | 8 | ADD | 6 | 0 | | +| 256 | 16 | 4 | 4 | MUL | MUL | - | 16 | 4 | 4 | MUL | FIRST | - | - | - | - | 4 | 1 | | +| 268 | 12 | 4 | 8 | ADD | ADD | 256 | 16 | 8 | 8 | ADD | MUL | 16 | 8 | 8 | ADD | 6 | 0 | | +| 288 | 12 | 4 | 8 | ADD | MUL | - | 16 | 8 | 8 | ADD | ADD4 | 8 | 8 | - | - | 5 | 1 | | +| 300 | 12 | 4 | 8 | ADD | ADD2MUL3 | - | * | 4 | 8 | ADD | ADD4MUL5 | * | 8 | 8 | - | 6 | 2 | | +| 336 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | ADD4MUL5 | * | 4 | 8 | - | 6 | 2 | | +| 384 | 16 | 8 | 8 | ADD | MUL | - | 16 | 4 | 4 | MUL | ADD4 | 8 | 8 | - | - | 5 | 1 | | +| 512 | 64 | 8 | 8 | MUL | ADD | - | 16 | 8 | 8 | ADD | MUL4 | 4 | 4 | - | - | 5 | 1 | | +| 576 | 12 | 4 | 8 | ADD | MUL | 48 | 32 | 4 | 8 | MUL | ADD | 16 | 4 | 4 | MUL | 6 | 2 | | +| 592 | 16 | 8 | 8 | ADD | ADD2MUL3 | - | * | 8 | 8 | ADD | ADD4MUL5 | * | 8 | 8 | - | 6 | 1 | | +| 640 | 16 | 4 | 4 | MUL | MUL | - | 32 | 4 | 8 | MUL | ADD4 | 8 | 8 | - | - | 5 | 2 | | +| 768 | 12 | 4 | 8 | ADD | MUL | 64 | 32 | 4 | 8 | MUL | ADD | 32 | 4 | 8 | MUL | 6 | 2 | | +| 1024 | 32 | 4 | 8 | MUL | MUL | - | 32 | 4 | 8 | MUL | FIRST | - | - | - | - | 4 | 2 | | +| 1088 | 16 | 4 | 4 | MUL2 | MUL | - | 68 | 8 | 8 | MUL | ADD4MUL5 | * | 8 | 4 | MUL | 5 | 3 | | +| 1152 | 12 | 4 | 8 | ADD | MUL | - | 16 | 8 | 8 | ADD | MUL4 | 8 | 8 | - | - | 5 | 1 | | +| 1280 | 16 | 4 | 4 | MUL | MUL | 80 | 16 | 4 | 4 | MUL | ADD | 64 | 8 | 8 | MUL | 6 | 2 | | +| 1536 | 16 | 8 | 8 | ADD | MUL | - | 16 | 4 | 4 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | | +| 2048 | 16 | 4 | 4 | MUL | MUL | - | 32 | 4 | 8 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | | +| 2304 | 32 | 4 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | ADD4 | 8 | 8 | - | - | 5 | 2 | | +| 4096 | 64 | 8 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | FIRST | - | - | - | - | 4 | 2 | | +| 4608 | 64 | 8 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | ADD4 | 12 | 8 | 4 | ADD | 5 | 2 | | +| 8192 | 32 | 4 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | | +| 16384 | 16 | 8 | 8 | ADD | MUL | 1024 | 32 | 4 | 8 | MUL | MUL | 32 | 4 | 8 | MUL | 6 | 2 | | +| 24576 | 12 | 4 | 8 | ADD | MUL | 2048 | 32 | 4 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 2 | | +| 32768 | 64 | 8 | 8 | MUL | MUL | - | 64 | 8 | 8 | MUL | MUL4 | 8 | 8 | - | - | 5 | 2 | | +| 65536 | 16 | 8 | 8 | ADD | MUL | 4096 | 64 | 8 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 3 | | +|131072 | 64 | 8 | 8 | MUL | MUL | 2048 | 32 | 4 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 3 | | +|262144 | 64 | 8 | 8 | MUL | MUL | 4096 | 64 | 8 | 8 | MUL | MUL | 64 | 8 | 8 | MUL | 6 | 3 | | `*` - This column is cannot express a value for the two combined pair of LUTs LUTs in the case where one of them is added to the lower LUTs, and the whole thing multiplied by the other.