瀏覽代碼

Convert doc about equation minimizing to markdown

Baglio Tabifata 4 年之前
父節點
當前提交
1be1795956
共有 1 個文件被更改,包括 162 次插入0 次删除
  1. 162 0
      docs/Minimize_Equations_with_feedbacks.md

+ 162 - 0
docs/Minimize_Equations_with_feedbacks.md

@@ -0,0 +1,162 @@
+# Additional minimization of PAL equations by using feedback outputs
+
+## Introduction
+
+Sometimes, truth tables brute-forced from a PAL and minimized with espresso contain expressions that are too long to fit into a newly programmed GAL/PAL device, which has limits in the number of usable terms.
+This is because the brute-forcing and minimization do not take into account the possibility to use feedback outputs (outputs the values of which are used as inputs to other equations) included in a PAL device to further reduce the number of necessary terms.
+The equations generated by brute-forcing and espresso are equivalent to the originals, but additional simplification making use feedback outputs can be occasionally required. In this case, we can use **Logic Friday** to help us in the procedure.
+
+## The Procedure
+
+The procedure can be summarized by the following steps:
+
+1. Minimize the truth table and obtain the equations.
+2. Scan the equations to find ones that appear long and have many terms shared with others.
+    - You should also identify equations that are possible feedbacks you can use to simplify the other equations.
+3. Extract the equations, put them in **Logic Friday**, minimize and turn them into __Products of Sums__.
+4. Massage the equations to find how to replace terms by using the feedbacks.
+5. Repeat 2-4 as needed.
+
+### Example
+
+#### Step 1
+
+After going through the automatic analisys and bruteforcing of a *PAL16L8* IC, we end up with a truth table that put through **espresso** minimizes to the following equations:
+
+```text
+!io18 = (!i2&i3&!i4&i5&!i8&!io13) | (!i2&i3&!i4&!i6&i8&!io13) | (!i2&i3&!i4&!i5&i6&!io13) | (!i2&i3&!i4&!i7&!io13) | (i1&!i2&i3&!i4&!io13);
+
+!io17 = (i2&!i3&i4&i5&!i8&!io13) | (i2&!i3&i4&!i6&i8&!io13) | (i2&!i3&i4&!i5&i6&!io13) | (i2&!i3&i4&!i7&!io13) | (i1&i2&!i3&i4&!io13);
+
+!io16 = (i2&!i3&!i4&i5&!i8&!io13) | (i2&!i3&!i4&!i6&i8&!io13) | (i2&!i3&!i4&!i5&i6&!io13) | (i2&!i3&!i4&!i7&!io13) | (i1&i2&!i3&!i4&!io13);
+
+!io15 = (!i1&i5&i6&i7&i8&!io13);
+
+!io14 = (!i7&!io13) | (i1&!io13) | (i8&!io13) | (i6&!io13) | (i5&!io13);
+
+!o19 = (!i2&!i3&!i4&i5&!i8&!io13) | (!i2&!i3&!i4&!i6&i8&!io13) | (!i2&!i3&!i4&!i5&i6&!io13) | (!i2&!i3&!i4&!i7&!io13) | (i1&!i2&!i3&!i4&!io13);
+
+!o12 = (!i1&!i5&!i6&i7&!i8&!i9&!i11);
+```
+
+Notice that **espresso** will NOT put the exclamation mark at the beginning of every equation. But as the PAL16L8 is an active-low device, and the minimized equations are representative of the OFF-set of the truth table, I added it myself for clarity.
+
+#### Step 2
+
+Notice how many of the equations that we obtained in the previous step are sharing a lot of similar terms with `!io14` and `!io15`.
+We'll randomly pick `!io16` to simplify in the following steps.
+
+#### Step 3
+
+Let's fire up **Logic Friday** and put the equations in.
+
+Below you can see the equation for `!io16`, minimized and converted into a **Product of Sums** (let’s replace the negation at the beginning of the equation with an `n` for the sake of simplicity and because Logic Friday would error out with such syntax: we’ll just add it back when preparing the equations to program on a new chip).
+
+```text
+Entered:
+nio16 = (i2&!i3&!i4&i5&!i8&!io13) | (i2&!i3&!i4&!i6&i8&!io13) | (i2&!i3&!i4&!i5&i6&!io13) | (i2&!i3&!i4&!i7&!io13) | (i1&i2&!i3&!i4&!io13);
+
+Minimized:
+nio16 = i2 i3' i4' io13' i7'  + i2 i3' i4' io13' i1 + i2 i3' i4' i5' i8 io13'  + i2 i3' i4' i8' io13' i6  + i2 i3' i4' i5 io13' i6' ;
+
+Minimized Product of Sums:
+nio16 = (io13')(i4')(i3')(i2)(i5'+i8'+i6'+i7'+i1)(i5+i8+i6+i7'+i1);
+```
+
+Then we do the same for the equation of `!io14`:
+
+```text
+Entered:
+nio14 = (!i7&!io13) | (i1&!io13) | (i8&!io13) | (i6&!io13) | (i5&!io13);
+
+Minimized:
+nio14 = i7' io13'  + io13' i1  + io13' i8  + io13' i6  + io13' i5;
+
+Minimized Product of Sums:
+nio14 = (io13')(i7'+i1+i8+i6+i5);
+```
+
+Begin to notice similarities?
+
+Let's do the same for `!io15`:
+
+```text
+Entered:
+nio15 = (!i1&i5&i6&i7&i8&!io13);
+
+Minimized:
+nio15 = i1' i5 i6 i7 i8 io13';
+```
+
+We don't need to turn this into a **Product of Sums** as we have no sums here.
+
+#### Step 4
+
+We can see that all of `!io14` appears in the equation of `!io16`. And we can also notice that a term very similar
+to `!io15` is also in `!io16`.
+
+First, we simply replace `!io14` in `!io16` and get:
+
+```text
+nio16 = (io14')(i4')(i3')(i2)(i5'+i8'+i6'+i7'+i1);
+```
+
+Note how the term `io14` is negated in the equation : remember what You read above, that every equation is of the OFF-set of the truth table and that we’ve replaced the negation with an `n` for simplicity when working with **Logic Friday**. Now we just added it back.
+
+Then, let’s look at `!io15` and what happens if we invert it:
+
+```text
+Entered:
+io15 = !(!i1&i5&i6&i7&i8&!io13);
+
+Minimized:
+io15 = i1  + i5'  + i6'  + i7'  + i8'  + io13;
+```
+
+This time it's no longer `nio15`, because, having inverted it, it now represents the ON-set of the truth table, and as such it's just `io15`.
+
+So, looking at `!io16`, we see there is a group of terms almost identical to `io15` (`(i5'+i8'+i6'+i7'+i1)`), but lacking `io13`, so we’ll simply have to add it back in negated form to counter the one we’re adding by replacing the group with `io15`:
+
+```text
+nio16 = (io14')(i4')(i3')(i2)(i5'+i8'+i6'+i7'+i1);
+```
+
+becomes:
+
+```text
+nio16 = (io14')(i4')(i3')(i2)(io15 & io13');
+```
+
+Notice that in this case `io15` is not negated: we already inverted it, remember?
+
+We can now minimize `!io16` again and see what we get:
+
+```text
+Entered:
+io16 = (io14')(i4')(i3')(i2)(io15 & io13');
+
+Minimized:
+io16 = i4' i3' i2 io15 io13' io14';
+
+```
+
+##### Note
+
+So, You might be wondering
+> why you replaced a term with `io13` in OR and added `io13’` in AND?”
+
+Just think about it this way: you had a condition inside the parentheses, that condition was not dependent on the status of `io13` (it was `i1 | !i5 | !i6 | !i7 | !i8`), but we replaced it with a condition that depended on `io13` (`io15` included that term in OR, so it is sufficient for it to be **true** to turn **true** the whole term between parentheses).
+
+To counter it, we need to make sure that, if the condition is verified, it is so **without** `io13` being **true**, and we can do it by adding an AND condition that checks for this.
+
+It’s perhaps clearer by looking at the expanded equation
+
+```text
+nio16 = (io14')(i4')(i3')(i2)(io15 & io13');
+nio16 = (io14')(i4')(i3')(i2)((i1 + i5' + i6' + i7' + i8' + io13) & io13' );
+```
+
+## Links & References
+
+- A modern and compilable re-host of the [Espresso](https://github.com/classabbyamp/espresso-logic) heuristic logic minimizer.
+- [Logic Friday](https://download.cnet.com/developer/logic-friday/i-10268041) 1.1.4