Advertisement
BugFix

Gate.lua

Nov 2nd, 2014
416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 37.81 KB | None | 0 0
  1. -- TIME_STAMP   2014-07-14 16:09:50   v 0.1
  2.  
  3. do
  4.     -----------------------------------------------------------------------------------------------
  5.     -- Objekte:
  6.     --    NOT          Ausgangspegel ist invertierter Eingangspegel
  7.     --    AND          Ausgangspegel TRUE, wenn beide Eingangspegel TRUE sind
  8.     --    AND_TRIPLE   Ausgangspegel TRUE, wenn alle drei Eingangspegel TRUE sind
  9.     --    OR           Ausgangspegel TRUE, wenn einer der Eingangspegel TRUE ist
  10.     --    OR_TRIPLE    Ausgangspegel TRUE, wenn einer der drei Eingangspegel TRUE ist
  11.     --    XOR          Ausgangspegel TRUE, wenn die Eingangspegel ungleich sind
  12.     --    NAND         Ausgangspegel FALSE, wenn beide Eingange TRUE, sonst immer TRUE
  13.     --    NOR          Ausgangspegel TRUE, wenn beide Eingange FALSE
  14.     --    XNOR         Ausgangspegel TRUE, wenn beide Eingange denselben Pegel aufweisen
  15.     --    SPLIT        Verknupfungsobjekt um einen Ein-/Ausgangspegel an mehrere Ein-/Ausgange zu legen
  16.     --    [VISITOR]    internes Besucherobjekt
  17.     --
  18.     -- Module:
  19.     --    HALFADDER
  20.     --
  21.     -- Globale Methoden:
  22.     --    Wire         Verknupft zwei Objekte miteinander
  23.     --    TruthTable   Wahrheitstabelle fur ein Gatter ausgeben
  24.     --    [Int2Bool]   Integerwert der Eingabe in Boolwert wandeln 
  25.     --    [Bool2Int]   Boolwert der Ausgabe in Integerwert wandeln 
  26.     --                
  27.     -- Eingangspins:   a         NOT
  28.     --                 a,  b     AND, OR, XOR, NAND, NOR, XNOR
  29.     --                 a[, b, c] SPLIT, AND_TRIPLE, OR_TRIPLE
  30.     -- Ausgangspins:   q         NOT, AND, OR, XOR, NAND, NOR, XNOR
  31.     --                 q[, b, c] SPLIT
  32.     -----------------------------------------------------------------------------------------------
  33.    
  34.     Gate = {
  35.         -----------------------------------------------------------------------------------------------
  36.         -- Integer in Boolschen Wert wandeln  (0 = false, jeder andere Wert ist true)
  37.         -----------------------------------------------------------------------------------------------
  38.         Int2Bool = function(self, val)
  39.                 local sType = type(val)
  40.                 if sType == 'boolean' then
  41.                     return val
  42.                 elseif sType ~= 'number' or val == 0 then
  43.                     return false
  44.                 else
  45.                     return true
  46.                 end
  47.             end,
  48.  
  49.         -----------------------------------------------------------------------------------------------
  50.         -- Boolschen Wert Integer in wandeln  (false = 0, jeder andere Wert ist 1)
  51.         -----------------------------------------------------------------------------------------------
  52.         Bool2Int = function(self, val)
  53.                 local sType = type(val)
  54.                 if sType == 'number' then
  55.                     return val
  56.                 elseif val == false then
  57.                     return 0
  58.                 else
  59.                     return 1
  60.                 end
  61.             end,
  62.            
  63.         -----------------------------------------------------------------------------------------------
  64.         -- Verbinde: Von-Objekt/Von-Pin An-Objekt/An-Pin
  65.         -----------------------------------------------------------------------------------------------
  66.         Wire = function(self, oFrom, pinFrom, oTo, pinTo)
  67.                 -- Im Von-Objekt: Ausgangs-Objekt = Ziel-Objekt, Ausgangs-Pin = Eingangs-Pin Ziel-Objekt
  68.                 if pinFrom == 'b' then
  69.                     oFrom.obj_b = oTo
  70.                     oFrom.pin_b = pinTo
  71.                 elseif pinFrom == 'c' then
  72.                     oFrom.obj_c = oTo
  73.                     oFrom.pin_c = pinTo
  74.                 else
  75.                     oFrom.obj_q = oTo
  76.                     oFrom.pin_q = pinTo
  77.                 end
  78.                 -- Im Ziel-Objekt: am Output-Objekt eintragen: von-Objekt, von-Pin
  79.                 if pinTo == 'b' then
  80.                     oTo.obj_b = oFrom
  81.                     oTo.pin_b = pinFrom
  82.                 elseif pinTo == 'c' then
  83.                     oTo.obj_c = oFrom
  84.                     oTo.pin_c = pinFrom
  85.                 else
  86.                     oTo.obj_a = oFrom
  87.                     oTo.pin_a = pinFrom
  88.                 end
  89.             end,
  90.            
  91.         -----------------------------------------------------------------------------------------------
  92.         -- Wahrheitstabelle aller Schaltzustande fur das Objekt ausgeben
  93.         -----------------------------------------------------------------------------------------------
  94.         TruthTable = function(self, oFrom)
  95.                 local sClass = oFrom.class
  96.                 local sOut, tFormat = 'TRUTH TABLE '..sClass..':\n'..('-'):rep(13+#sClass)..'\n'
  97.                 if sClass == 'NOT' then
  98.                     tFormat = {1, 'A   Q\n', '%d   %d', {0}, {1}}
  99.                 elseif (' AND OR XOR NAND NOR XNOR '):find(' '..sClass..' ') then
  100.                     tFormat = {2, 'A   B   Q\n', '%d   %d   %d', {0,0}, {0,1}, {1,0}, {1,1}}
  101.                 elseif sClass == 'COMPARE' then
  102.                     tFormat = {3, 'A   B   <   =   >\n', '%d   %d   %d   %d   %d', {0,0}, {0,1}, {1,0}, {1,1}}
  103.                 elseif sClass == 'HALFADDER' then
  104.                     tFormat = {4, 'X   Y   C   S\n', '%d   %d   %d   %d', {0,0}, {0,1}, {1,0}, {1,1}}
  105.                 elseif sClass == 'FULLADDER' then
  106.                     tFormat = {5, 'X   Y   Cin S Cout\n', '%d   %d   %d   %d   %d', {0,0,0}, {0,0,1}, {0,1,0}, {0,1,1}, {1,0,0}, {1,0,1}, {1,1,0}, {1,1,1}}
  107.                 elseif (' AND_TRIPLE OR_TRIPLE '):find(' '..sClass..' ') then
  108.                     tFormat = {6, 'A   B   C   Q\n', '%d   %d   %d   %d', {0,0,0}, {0,0,1}, {0,1,0}, {0,1,1}, {1,0,0}, {1,0,1}, {1,1,0}, {1,1,1}}
  109.                 end
  110.                 sOut = sOut..tFormat[2]
  111.                 for i = 4, #tFormat do
  112.                     if tFormat[1] == 1 then
  113.                         oFrom:Set(tFormat[i][1])
  114.                         sOut = sOut..string.format(tFormat[3], tFormat[i][1], Gate:Bool2Int(oFrom.q))..'\n'
  115.                     elseif tFormat[1] == 2 then
  116.                         oFrom:Set(tFormat[i][1], tFormat[i][2])
  117.                         sOut = sOut..string.format(tFormat[3], tFormat[i][1], tFormat[i][2], Gate:Bool2Int(oFrom.q))..'\n'
  118.                     elseif tFormat[1] == 3 then
  119.                         oFrom:Set(tFormat[i][1], tFormat[i][2])
  120.                         sOut = sOut..string.format(tFormat[3], tFormat[i][1], tFormat[i][2], Gate:Bool2Int(oFrom.q_lt), Gate:Bool2Int(oFrom.q_eq), Gate:Bool2Int(oFrom.q_gt))..'\n'
  121.                     elseif tFormat[1] == 4 then
  122.                         oFrom:Set(tFormat[i][1], tFormat[i][2])
  123.                         sOut = sOut..string.format(tFormat[3], tFormat[i][1], tFormat[i][2], Gate:Bool2Int(oFrom.c), Gate:Bool2Int(oFrom.s))..'\n'
  124.                     elseif tFormat[1] == 5 then
  125.                         oFrom:Set(tFormat[i][1], tFormat[i][2], tFormat[i][3])
  126.                         sOut = sOut..string.format(tFormat[3], tFormat[i][1], tFormat[i][2], tFormat[i][3], Gate:Bool2Int(oFrom.c), Gate:Bool2Int(oFrom.s))..'\n'
  127.                     elseif tFormat[1] == 6 then
  128.                         oFrom:Set(tFormat[i][1], tFormat[i][2], tFormat[i][3])
  129.                         sOut = sOut..string.format(tFormat[3], tFormat[i][1], tFormat[i][2], tFormat[i][3], Gate:Bool2Int(oFrom.q))..'\n'
  130.                     end
  131.                 end
  132.                 print(sOut)
  133.             end,
  134.        
  135.         -----------------------------------------------------------------------------------------------
  136.         -- Eingangssignal wird invertiert ausgegeben                                             NOT --
  137.         -----------------------------------------------------------------------------------------------
  138.         NOT = {
  139.             class = 'NOT',                                                     -- Klassenname
  140.             name,                                                              -- Name Klasseninstanz-Objekt (optional)
  141.             a_old,                                                             -- letzter Wert Eingang
  142.             a,                                                                 -- Wert Eingang
  143.             q,                                                                 -- Wert Ausgang
  144.             obj_a,                                                             -- Objektverknupfung an Eingang
  145.             obj_q,                                                             -- Objektverknupfung an Ausgang
  146.             pin_a,                                                             -- Pin des Objektes an a
  147.             pin_q,                                                             -- Pin des Objektes an q
  148.             visitor_auto_run = false,                                          -- "true" aktualisiert autom. Objekt am Ausgang bei Refresh
  149.             TruthTable = function(self)
  150.                     Gate:TruthTable(self)
  151.                 end,
  152.             Trace = function(self, sTrace)
  153.                     if sTrace == nil then sTrace = '' end
  154.                     sTrace = sTrace..self.name..'\n'
  155.                     if self.obj_a ~= nil then
  156.                         sTrace = sTrace..'\tIN (Pin: Value)\ta:\t'..Gate:Bool2Int(self.a)..' from '..self.obj_a.name..'/'..self.pin_a..'\n'
  157.                     else
  158.                         sTrace = sTrace..'\tIN (Pin: Value)\ta:\t'..Gate:Bool2Int(self.a)
  159.                     end
  160.                     if self.obj_q ~= nil then
  161.                         sTrace = sTrace..'\tOUT (Pin: Value)\tq:\t'..Gate:Bool2Int(self.q)..' to '..self.obj_q.name..'/'..self.pin_q..':\t'..Gate:Bool2Int(self.obj_q[self.pin_q])..'\n'
  162.                     else
  163.                         sTrace = sTrace..'\tOUT (Pin: Value)\tq:\t'..Gate:Bool2Int(self.q)..'\n'
  164.                     end
  165.                     return sTrace
  166.                 end,
  167.             Refresh = function(self)                                           -- Aktualisieren Ausgangswert des Objektes und Setzen des Eingangs an verknupftem Objekt
  168.                     if self.a ~= self.a_old then                               -- Eingangspegel hat sich geandert
  169.                         self.a_old = self.a
  170.                         self.q = not self.a
  171.                         if self.obj_q ~= nil then                              -- am Ausgang ist ein Objekt verknupft
  172.                             self.obj_q[self.pin_q] = self.q
  173.                             if self.visitor_auto_run then                      -- nach Aktualisieren der Werte soll verknupftes Objekt besucht (und aktualisiert) werden
  174.                                 Gate.VISITOR:visit(self.obj_q)
  175.                             end
  176.                         end
  177.                     end
  178.                 end,
  179.             Set = function(self, a)
  180.                     self.a = Gate:Int2Bool(a)
  181.                     self:Refresh()
  182.                 end,
  183.             New = function(self, obj, name, f_auto)
  184.                     obj = obj or {}
  185.                     setmetatable(obj, self)
  186.                     self.__index = self
  187.                     if name ~= nil then obj.name = name end
  188.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  189.                     return obj
  190.                 end
  191.         },
  192.  
  193.         -----------------------------------------------------------------------------------------------
  194.         -- Beide Eingangspegel mussen TRUE sein, damit der Ausgangspegel TRUE ist                AND --
  195.         -----------------------------------------------------------------------------------------------
  196.         AND = {
  197.             class = 'AND',
  198.             name,
  199.             a_old,
  200.             b_old,
  201.             a,
  202.             b,
  203.             q,
  204.             obj_a,          
  205.             obj_b,          
  206.             obj_q,  
  207.             pin_a,
  208.             pin_b,
  209.             pin_q,
  210.             visitor_auto_run = false,
  211.             TruthTable = function(self)
  212.                     Gate:TruthTable(self)
  213.                 end,
  214.             Refresh = function(self)                          
  215.                     if (self.a ~= self.a_old) or
  216.                        (self.b ~= self.b_old)then                          
  217.                         self.a_old = self.a
  218.                         self.b_old = self.b
  219.                         self.q = self.a and self.
  220.                         if self.obj_q ~= nil then                  
  221.                             self.obj_q[self.pin_q] = self.q    
  222.                             if self.visitor_auto_run then          
  223.                                 Gate.VISITOR:visit(self.obj_q)     
  224.                             end    
  225.                         end    
  226.                     end    
  227.                 end,       
  228.             Set = function(self, a, b)     
  229.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  230.                     if b ~= nil then self.b = Gate:Int2Bool(b) end         
  231.                     self:Refresh()     
  232.                 end,       
  233.             New = function(self, obj, name, f_auto)
  234.                     obj = obj or {}
  235.                     setmetatable(obj, self)
  236.                     self.__index = self
  237.                     if name ~= nil then obj.name = name end
  238.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  239.                     return obj
  240.                 end
  241.         },
  242.        
  243.         -----------------------------------------------------------------------------------------------
  244.         -- Alle drei Eingangspegel mussen TRUE sein, damit der Ausgangspegel TRUE ist            AND --
  245.         -----------------------------------------------------------------------------------------------
  246.         AND_TRIPLE = {
  247.             class = 'AND_TRIPLE',
  248.             name,
  249.             a_old,
  250.             b_old,
  251.             c_old,
  252.             a,
  253.             b,
  254.             c,
  255.             q,
  256.             obj_a,          
  257.             obj_b,          
  258.             obj_c,          
  259.             obj_q,  
  260.             pin_a,
  261.             pin_b,
  262.             pin_c,
  263.             pin_q,
  264.             visitor_auto_run = false,
  265.             TruthTable = function(self)
  266.                     Gate:TruthTable(self)
  267.                 end,
  268.             Refresh = function(self)                          
  269.                     if (self.a ~= self.a_old) or
  270.                        (self.b ~= self.b_old) or
  271.                        (self.c ~= self.c_old) then                          
  272.                         self.a_old = self.a
  273.                         self.b_old = self.b
  274.                         self.c_old = self.c
  275.                         self.q = (self.a and self.b) and self.c
  276.                         if self.obj_q ~= nil then
  277.                             self.obj_q[self.pin_q] = self.q
  278.                             if self.visitor_auto_run then
  279.                                 Gate.VISITOR:visit(self.obj_q)
  280.                             end
  281.                         end
  282.                     end
  283.                 end,
  284.             Set = function(self, a, b, c)
  285.                     if a ~= nil then self.a = Gate:Int2Bool(a) end
  286.                     if b ~= nil then self.b = Gate:Int2Bool(b) end
  287.                     if c ~= nil then self.c = Gate:Int2Bool(c) end
  288.                     self:Refresh()
  289.                 end,
  290.             New = function(self, obj, name, f_auto)
  291.                     obj = obj or {}
  292.                     setmetatable(obj, self)
  293.                     self.__index = self
  294.                     if name ~= nil then obj.name = name end
  295.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  296.                     return obj
  297.                 end
  298.         },
  299.        
  300.         -----------------------------------------------------------------------------------------------
  301.         -- Einer der Eingangspegel muss TRUE sein, damit der Ausgangspegel TRUE ist               OR --
  302.         -----------------------------------------------------------------------------------------------
  303.         OR = {
  304.             class = 'OR',
  305.             name,
  306.             a_old,
  307.             b_old,
  308.             a,
  309.             b,
  310.             q,
  311.             obj_a,            
  312.             obj_b,            
  313.             obj_q,  
  314.             pin_a,
  315.             pin_b,
  316.             pin_q,            
  317.             visitor_auto_run = false,
  318.             TruthTable = function(self)
  319.                     Gate:TruthTable(self)
  320.                 end,
  321.             Refresh = function(self)                          
  322.                     if (self.a ~= self.a_old) or
  323.                        (self.b ~= self.b_old)then                          
  324.                         self.a_old = self.a
  325.                         self.b_old = self.b
  326.                         self.q = self.a or self.b  
  327.                         if self.obj_q ~= nil then                  
  328.                             self.obj_q[self.pin_q] = self.q    
  329.                             if self.visitor_auto_run then          
  330.                                 Gate.VISITOR:visit(self.obj_q)     
  331.                             end    
  332.                         end    
  333.                     end    
  334.                 end,       
  335.             Set = function(self, a, b)     
  336.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  337.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  338.                     self:Refresh()     
  339.                 end,   
  340.             New = function(self, obj, name, f_auto)
  341.                     obj = obj or {}
  342.                     setmetatable(obj, self)
  343.                     self.__index = self
  344.                     if name ~= nil then obj.name = name end
  345.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  346.                     return obj
  347.                 end
  348.         },
  349.        
  350.         -----------------------------------------------------------------------------------------------
  351.         -- Einer der Eingangspegel muss TRUE sein, damit der Ausgangspegel TRUE ist               OR --
  352.         -----------------------------------------------------------------------------------------------
  353.         OR_TRIPLE = {
  354.             class = 'OR_TRIPLE',
  355.             name,
  356.             a_old,
  357.             b_old,
  358.             c_old,
  359.             a,
  360.             b,
  361.             c,
  362.             q,
  363.             obj_a,            
  364.             obj_b,            
  365.             obj_c,            
  366.             obj_q,  
  367.             pin_a,
  368.             pin_b,
  369.             pin_c,
  370.             pin_q,            
  371.             visitor_auto_run = false,
  372.             TruthTable = function(self)
  373.                     Gate:TruthTable(self)
  374.                 end,
  375.             Refresh = function(self)                          
  376.                     if (self.a ~= self.a_old) or
  377.                        (self.b ~= self.b_old) or
  378.                        (self.c ~= self.c_old) then                          
  379.                         self.a_old = self.a
  380.                         self.b_old = self.b
  381.                         self.c_old = self.c
  382.                         self.q = self.a or self.b or self.c
  383.                         if self.obj_q ~= nil then                  
  384.                             self.obj_q[self.pin_q] = self.q    
  385.                             if self.visitor_auto_run then          
  386.                                 Gate.VISITOR:visit(self.obj_q)     
  387.                             end    
  388.                         end    
  389.                     end    
  390.                 end,       
  391.             Set = function(self, a, b, c)      
  392.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  393.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  394.                     if c ~= nil then self.c = Gate:Int2Bool(c) end     
  395.                     self:Refresh()     
  396.                 end,   
  397.             New = function(self, obj, name, f_auto)
  398.                     obj = obj or {}
  399.                     setmetatable(obj, self)
  400.                     self.__index = self
  401.                     if name ~= nil then obj.name = name end
  402.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  403.                     return obj
  404.                 end
  405.         },
  406.  
  407.         -----------------------------------------------------------------------------------------------
  408.         -- Ausgangspegel ist TRUE, wenn die Eingangspegel ungleich sind                          XOR --
  409.         -----------------------------------------------------------------------------------------------
  410.         XOR = {
  411.             class = 'XOR',
  412.             name,
  413.             a_old,
  414.             b_old,
  415.             a,
  416.             b,
  417.             q,
  418.             obj_a,          
  419.             obj_b,          
  420.             obj_q,  
  421.             pin_a,
  422.             pin_b,
  423.             pin_q,          
  424.             visitor_auto_run = false,
  425.             TruthTable = function(self)
  426.                     Gate:TruthTable(self)
  427.                 end,
  428.             Refresh = function(self)                          
  429.                     if (self.a ~= self.a_old) or
  430.                        (self.b ~= self.b_old)then                          
  431.                         self.a_old = self.a
  432.                         self.b_old = self.b
  433.                         self.q = (self.a ~= self.b)
  434.                         if self.obj_q ~= nil then                  
  435.                             self.obj_q[self.pin_q] = self.q    
  436.                             if self.visitor_auto_run then          
  437.                                 Gate.VISITOR:visit(self.obj_q)     
  438.                             end    
  439.                         end    
  440.                     end    
  441.                 end,       
  442.             Set = function(self, a, b)     
  443.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  444.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  445.                     self:Refresh()     
  446.                 end,
  447.             New = function(self, obj, name, f_auto)
  448.                     obj = obj or {}
  449.                     setmetatable(obj, self)
  450.                     self.__index = self
  451.                     if name ~= nil then obj.name = name end
  452.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  453.                     return obj
  454.                 end
  455.         },
  456.  
  457.         -----------------------------------------------------------------------------------------------
  458.         -- Ausgangspegel ist FALSE, wenn beide Eingange TRUE, sonst immer TRUE                  NAND --
  459.         -----------------------------------------------------------------------------------------------
  460.         NAND = {
  461.             class = 'NAND',
  462.             name,
  463.             a_old,
  464.             b_old,
  465.             a,
  466.             b,
  467.             q,
  468.             obj_a,          
  469.             obj_b,          
  470.             obj_q,  
  471.             pin_a,
  472.             pin_b,
  473.             pin_q,          
  474.             visitor_auto_run = false,
  475.             TruthTable = function(self)
  476.                     Gate:TruthTable(self)
  477.                 end,
  478.             Refresh = function(self)                          
  479.                     if (self.a ~= self.a_old) or
  480.                        (self.b ~= self.b_old)then                          
  481.                         self.a_old = self.a
  482.                         self.b_old = self.b
  483.                         self.q = not (self.a and self.b)
  484.                         if self.obj_q ~= nil then                  
  485.                             self.obj_q[self.pin_q] = self.q    
  486.                             if self.visitor_auto_run then          
  487.                                 Gate.VISITOR:visit(self.obj_q)     
  488.                             end    
  489.                         end    
  490.                     end    
  491.                 end,       
  492.             Set = function(self, a, b)     
  493.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  494.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  495.                     self:Refresh()     
  496.                 end,
  497.             New = function(self, obj, name, f_auto)
  498.                     obj = obj or {}
  499.                     setmetatable(obj, self)
  500.                     self.__index = self
  501.                     if name ~= nil then obj.name = name end
  502.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  503.                     return obj
  504.                 end
  505.         },
  506.  
  507.         -----------------------------------------------------------------------------------------------
  508.         -- Ausgangssignal nur TRUE, wenn beide Eingange FALSE                                    NOR --
  509.         -----------------------------------------------------------------------------------------------
  510.         NOR = {
  511.             class = 'NOR',
  512.             name,
  513.             a_old,
  514.             b_old,
  515.             a,
  516.             b,
  517.             q,
  518.             obj_a,          
  519.             obj_b,          
  520.             obj_q,  
  521.             pin_a,
  522.             pin_b,
  523.             pin_q,          
  524.             visitor_auto_run = false,
  525.             TruthTable = function(self)
  526.                     Gate:TruthTable(self)
  527.                 end,
  528.             Refresh = function(self)                          
  529.                     if (self.a ~= self.a_old) or
  530.                        (self.b ~= self.b_old)then                          
  531.                         self.a_old = self.a
  532.                         self.b_old = self.b
  533.                         self.q = (self.a or self.b) == false
  534.                         if self.obj_q ~= nil then                  
  535.                             self.obj_q[self.pin_q] = self.q    
  536.                             if self.visitor_auto_run then          
  537.                                 Gate.VISITOR:visit(self.obj_q)     
  538.                             end    
  539.                         end    
  540.                     end    
  541.                 end,       
  542.             Set = function(self, a, b)     
  543.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  544.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  545.                     self:Refresh()     
  546.                 end,
  547.             New = function(self, obj, name, f_auto)
  548.                     obj = obj or {}
  549.                     setmetatable(obj, self)
  550.                     self.__index = self
  551.                     if name ~= nil then obj.name = name end
  552.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  553.                     return obj
  554.                 end
  555.         },
  556.  
  557.         -----------------------------------------------------------------------------------------------
  558.         -- Ausgangspegel TRUE, wenn beide Eingange denselben Pegel aufweisen                    XNOR --
  559.         -----------------------------------------------------------------------------------------------
  560.         XNOR = {
  561.             class = 'XNOR',
  562.             name,
  563.             a_old,
  564.             b_old,
  565.             a,
  566.             b,
  567.             q,
  568.             obj_a,            
  569.             obj_b,            
  570.             obj_q,  
  571.             pin_a,
  572.             pin_b,
  573.             pin_q,            
  574.             visitor_auto_run = false,
  575.             TruthTable = function(self)
  576.                     Gate:TruthTable(self)
  577.                 end,
  578.             Refresh = function(self)                          
  579.                     if (self.a ~= self.a_old) or
  580.                        (self.b ~= self.b_old)then                          
  581.                         self.a_old = self.a
  582.                         self.b_old = self.b
  583.                         self.q = (self.a == self.b)
  584.                         if self.obj_q ~= nil then                  
  585.                             self.obj_q[self.pin_q] = self.q    
  586.                             if self.visitor_auto_run then          
  587.                                 Gate.VISITOR:visit(self.obj_q)     
  588.                             end    
  589.                         end    
  590.                     end    
  591.                 end,       
  592.             Set = function(self, a, b)     
  593.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  594.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  595.                     self:Refresh()     
  596.                 end,
  597.             New = function(self, obj, name, f_auto)
  598.                     obj = obj or {}
  599.                     setmetatable(obj, self)
  600.                     self.__index = self
  601.                     if name ~= nil then obj.name = name end
  602.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  603.                     return obj
  604.                 end
  605.         },
  606.  
  607.         -----------------------------------------------------------------------------------------------
  608.         -- Vergleichsobjekt, 3 Ausgangspegel: groesser, gleich, kleiner                      COMPARE --
  609.         -----------------------------------------------------------------------------------------------
  610.         COMPARE = {
  611.             class = 'COMPARE',
  612.             name,
  613.             a_old,
  614.             b_old,
  615.             a,
  616.             b,
  617.             q_gt,  -- A groesser B
  618.             q_lt,  -- A kleiner B
  619.             q_eq,  -- A gleich B
  620.             obj_a,            
  621.             obj_b,            
  622.             obj_q_gt,  
  623.             obj_q_lt,  
  624.             obj_q_eq,  
  625.             pin_a,
  626.             pin_b,
  627.             pin_q_gt,            
  628.             pin_q_lt,            
  629.             pin_q_eq,            
  630.             visitor_auto_run = false,
  631.             TruthTable = function(self)
  632.                     Gate:TruthTable(self)
  633.                 end,
  634.             Compare = function(self, a, b)
  635.                     local lt, eq, gt = false, false, false
  636.                     if a == b then
  637.                         eq = true
  638.                     elseif not a and b then
  639.                         lt = true
  640.                     else
  641.                         gt = true
  642.                     end
  643.                     return lt, eq, gt
  644.                 end,
  645.             Refresh = function(self)  
  646.                     if (self.a ~= self.a_old) or
  647.                        (self.b ~= self.b_old) then                          
  648.                         self.a_old = self.a
  649.                         self.b_old = self.b
  650.                         self.q_lt, self.q_eq, self.q_gt = self:Compare(self.a, self.b)
  651.                         local tQ = {}
  652.                         if self.obj_q_lt ~= nil  then                  
  653.                             self.obj_q_lt[self.pin_q_lt] = self.q_lt
  654.                             tQ[#tQ+1] = self.obj_q_lt
  655.                         end
  656.                         if self.obj_q_gt ~= nil  then                  
  657.                             self.obj_q_gt[self.pin_q_gt] = self.q_gt
  658.                             tQ[#tQ+1] = self.obj_q_gt
  659.                         end
  660.                         if self.obj_q_eq ~= nil  then                  
  661.                             self.obj_q_eq[self.pin_q_eq] = self.q_eq
  662.                             tQ[#tQ+1] = self.obj_q_eq
  663.                         end
  664.                         if self.visitor_auto_run then  
  665.                             if #tQ > 0 then
  666.                                 for i = 1, #tQ do
  667.                                     Gate.VISITOR:visit(tQ[i])
  668.                                 end
  669.                             end
  670.                         end    
  671.                     end    
  672.                 end,       
  673.             Set = function(self, a, b)     
  674.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  675.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  676.                     self:Refresh()     
  677.                 end,
  678.             New = function(self, obj, name, f_auto)
  679.                     obj = obj or {}
  680.                     setmetatable(obj, self)
  681.                     self.__index = self
  682.                     if name ~= nil then obj.name = name end
  683.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  684.                     return obj
  685.                 end
  686.         },
  687.  
  688.         -----------------------------------------------------------------------------------------------
  689.         -- Verknupfungsobjekt                                                                  SPLIT --
  690.         --    1 Eingang(A), 1 Ausgang(Q),                                                            --
  691.         --    2 als Ein- oder Ausgang(B,C) verwendbare Anschlusse                                    --
  692.         --    Ist ein Eingangspegel TRUE sind auch alle Ausgange TRUE                                --
  693.         --    Nur wenn alle Eingange FALSE sind, sind auch die Ausgange FALSE                        --
  694.         --    'A' und 'Q' mussen immer belegt sein, 'B' und 'C' sind optional                        --
  695.         -----------------------------------------------------------------------------------------------
  696.         SPLIT = {
  697.             class = 'SPLIT',
  698.             name,
  699.             a_old,
  700.             b_old,
  701.             c_old,
  702.             a,
  703.             b,
  704.             c,
  705.             q,
  706.             b_is_out = false,
  707.             c_is_out = false,
  708.             obj_a,            
  709.             obj_b,            
  710.             obj_c,            
  711.             obj_q,  
  712.             pin_a,
  713.             pin_b,
  714.             pin_c,
  715.             pin_q,            
  716.             visitor_auto_run = false,
  717.             Output = function(self)
  718.                     if (not self.b_is_out) and (not self.c_is_out) then
  719.                         if self.a or self.b or self.c then
  720.                             return true
  721.                         else
  722.                             return false
  723.                         end
  724.                     elseif (not self.b_is_out) and self.c_is_out then
  725.                         if self.a or self.b then
  726.                             return true
  727.                         else
  728.                             return false
  729.                         end
  730.                     elseif self.b_is_out and (not self.c_is_out) then
  731.                         if self.a or self.c then
  732.                             return true
  733.                         else
  734.                             return false
  735.                         end
  736.                     elseif self.b_is_out and self.c_is_out then
  737.                         return self.a
  738.                     end
  739.                 end,
  740.             Refresh = function(self)
  741.                     local tRefresh, fOut = {}
  742.                     if (not self.b_is_out) and (not self.c_is_out) then
  743.                         if (self.a ~= self.a_old) or
  744.                            (self.b ~= self.b_old) or                        
  745.                            (self.c ~= self.c_old) then                      
  746.                             self.a_old = self.a
  747.                             self.b_old = self.b
  748.                             self.c_old = self.c
  749.                             self.q = self:Output()
  750.                             if self.obj_q ~= nil then                  
  751.                                 self.obj_q[self.pin_q] = self.q    
  752.                                 if self.visitor_auto_run then          
  753.                                     table.insert(tRefresh, self.obj_q)
  754.                                 end    
  755.                             end
  756.                         end
  757.                     elseif (not self.b_is_out) and self.c_is_out then
  758.                         if (self.a ~= self.a_old) or
  759.                            (self.b ~= self.b_old) then
  760.                             self.a_old = self.a
  761.                             self.b_old = self.b
  762.                             fOut = self:Output()
  763.                             self.c = fOut
  764.                             self.q = fOut
  765.                             if self.obj_c ~= nil then                  
  766.                                 self.obj_c[self.pin_c] = self.c    
  767.                                 if self.visitor_auto_run then          
  768.                                     table.insert(tRefresh, self.obj_c)
  769.                                 end    
  770.                             end
  771.                             if self.obj_q ~= nil then                  
  772.                                 self.obj_q[self.pin_q] = self.q    
  773.                                 if self.visitor_auto_run then          
  774.                                     table.insert(tRefresh, self.obj_q)
  775.                                 end    
  776.                             end
  777.                         end
  778.                     elseif self.b_is_out and (not self.c_is_out) then
  779.                         if (self.a ~= self.a_old) or
  780.                            (self.b ~= self.b_old) then
  781.                             self.a_old = self.a
  782.                             self.c_old = self.c
  783.                             fOut = self:Output()
  784.                             self.b = fOut
  785.                             self.q = fOut
  786.                             if self.obj_b ~= nil then                  
  787.                                 self.obj_b[self.pin_b] = self.b    
  788.                                 if self.visitor_auto_run then          
  789.                                     table.insert(tRefresh, self.obj_b)
  790.                                 end    
  791.                             end
  792.                             if self.obj_q ~= nil then                  
  793.                                 self.obj_q[self.pin_q] = self.q    
  794.                                 if self.visitor_auto_run then          
  795.                                     table.insert(tRefresh, self.obj_q)
  796.                                 end    
  797.                             end
  798.                         end
  799.                     elseif self.b_is_out and self.c_is_out then
  800.                         if (self.a ~= self.a_old) then
  801.                             self.a_old = self.a
  802.                             fOut = self:Output()
  803.                             self.b = fOut
  804.                             self.c = fOut
  805.                             self.q = fOut
  806.                             if self.obj_b ~= nil then                  
  807.                                 self.obj_b[self.pin_b] = self.b    
  808.                                 if self.visitor_auto_run then          
  809.                                     table.insert(tRefresh, self.obj_b)
  810.                                 end    
  811.                             end
  812.                             if self.obj_c ~= nil then                  
  813.                                 self.obj_c[self.pin_c] = self.c    
  814.                                 if self.visitor_auto_run then          
  815.                                     table.insert(tRefresh, self.obj_c)
  816.                                 end    
  817.                             end
  818.                             if self.obj_q ~= nil then                  
  819.                                 self.obj_q[self.pin_q] = self.q    
  820.                                 if self.visitor_auto_run then          
  821.                                     table.insert(tRefresh, self.obj_q)
  822.                                 end    
  823.                             end
  824.                         end
  825.                     end
  826.                     if #tRefresh > 0 then
  827.                         for i = 1, #tRefresh do
  828.                             Gate.VISITOR:visit(tRefresh[i])
  829.                         end
  830.                     end
  831.                 end,
  832.             Set = function(self, a, b, c)      
  833.                     if a ~= nil then self.a = Gate:Int2Bool(a) end     
  834.                     if b ~= nil then self.b = Gate:Int2Bool(b) end     
  835.                     if c ~= nil then self.b = Gate:Int2Bool(c) end     
  836.                     self:Refresh()     
  837.                 end,
  838.             New = function(self, obj, name, f_auto)
  839.                     obj = obj or {}
  840.                     setmetatable(obj, self)
  841.                     self.__index = self
  842.                     if name ~= nil then obj.name = name end
  843.                     if f_auto ~= nil then obj.visitor_auto_run = f_auto end
  844.                     return obj
  845.                 end
  846.         },
  847.  
  848.         -----------------------------------------------------------------------------------------------
  849.         -- Refresh-Visitor                                                                   VISITOR --
  850.         -- Besucht Objekt am Ausgang und aktualisiert dessen Werte
  851.         -----------------------------------------------------------------------------------------------
  852.         VISITOR = {
  853.             class = 'VISITOR',
  854.             name = 'VisitorRefresh',
  855.             visit = function(self, oVisited)
  856.                     oVisited:Refresh()
  857.                 end,
  858.         },
  859.        
  860.         -----------------------------------------------------------------------------------------------
  861.         --                                                                               M O D U L E --
  862.         -- Eingangspegel (x, y, c, [x1, x2.., y1, y2..]) an Properties:
  863.         --     Objekt im Modul:     mod_oIn_x (mod_oIn_x1, mod_oIn_y1..)
  864.         --     Pin dieses Objektes: mod_pIn_x (mod_pIn_x1, mod_pIn_y1..)
  865.         -----------------------------------------------------------------------------------------------
  866.         HALFADDER = {
  867.             class = 'HALFADDER',
  868.             name,
  869.             c,
  870.             s,
  871.             oAND,
  872.             oXOR,
  873.             oSPLIT_AND,
  874.             oSPLIT_XOR,
  875.             TruthTable = function(self)
  876.                     Gate:TruthTable(self)
  877.                 end,
  878.             Set = function(self, x, y)
  879.                     self.oSPLIT_XOR:Set(x)
  880.                     self.oSPLIT_AND:Set(y)
  881.                     self.s = Gate:Bool2Int(self.oXOR.q)
  882.                     self.c = Gate:Bool2Int(self.oAND.q)
  883.                 end,
  884.             New = function(self, obj, name)
  885.                     obj = obj or {}
  886.                     self.oAND = Gate.AND:New(nil, 'And-Halfadder', true)
  887.                     self.oXOR = Gate.XOR:New(nil, 'XOr-Halfadder', true)
  888.                     self.oSPLIT_AND = Gate.SPLIT:New(nil, 'SPLIT-And-Halfadder', true)
  889.                     self.oSPLIT_XOR = Gate.SPLIT:New(nil, 'SPLIT-XOr-Halfadder', true)
  890.                     self.oSPLIT_AND.b_is_out = true
  891.                     self.oSPLIT_XOR.b_is_out = true
  892.                     Gate:Wire(self.oSPLIT_AND, 'b', self.oAND, 'a')
  893.                     Gate:Wire(self.oSPLIT_AND, 'q', self.oXOR, 'a')
  894.                     Gate:Wire(self.oSPLIT_XOR, 'b', self.oAND, 'b')
  895.                     Gate:Wire(self.oSPLIT_XOR, 'q', self.oXOR, 'b')
  896.                     setmetatable(obj, self)
  897.                     self.__index = self
  898.                     if name ~= nil then obj.name = name end
  899.                     return obj
  900.                 end
  901.         },
  902.        
  903.         FULLADDER = {
  904.             class = 'FULLADDER',
  905.             name,
  906.             c,
  907.             s,
  908.             oHA1,
  909.             oHA2,
  910.             oOR,
  911.             TruthTable = function(self)
  912.                     Gate:TruthTable(self)
  913.                 end,
  914.             Set = function(self, x, y, c_in)
  915.                     self.oHA1:Set(x, y)
  916.                     self.oHA2:Set(self.oHA1.s, c_in)
  917.                     self.oOR:Set(self.oHA1.c, self.oHA2.c)
  918.                     self.s = Gate:Bool2Int(self.oHA2.s)
  919.                     self.c = Gate:Bool2Int(self.oOR.q)
  920.                 end,
  921.             New = function(self, obj, name)
  922.                     obj = obj or {}
  923.                     self.oHA1 = Gate.HALFADDER:New(nil, 'HA1')
  924.                     self.oHA2 = Gate.HALFADDER:New(nil, 'HA2')
  925.                     self.oOR = Gate.OR:New(nil, 'Or-Adder', true)
  926.                     setmetatable(obj, self)
  927.                     self.__index = self
  928.                     if name ~= nil then obj.name = name end
  929.                     return obj
  930.                 end
  931.         },
  932.        
  933.         ADDER4BIT = {
  934.             class = 'ADDER4BIT',
  935.             name,
  936.             c,
  937.             s1,
  938.             s2,
  939.             s3,
  940.             s4,
  941.             oFA1,
  942.             oFA2,
  943.             oFA3,
  944.             oFA4,
  945.             Set = function(self, x1, x2, x3, x4, y1, y2, y3, y4, c_in)
  946.                     if c_in == nil then c_in = 0 end
  947.                     self.oFA1:Set(x1, y1, c_in)
  948.                     self.oFA2:Set(x2, y2, self.oFA1.c)
  949.                     self.oFA3:Set(x3, y3, self.oFA2.c)
  950.                     self.oFA4:Set(x4, y4, self.oFA3.c)
  951.                     self.s1 = Gate:Bool2Int(self.oFA1.s)
  952.                     self.s2 = Gate:Bool2Int(self.oFA2.s)
  953.                     self.s3 = Gate:Bool2Int(self.oFA3.s)
  954.                     self.s4 = Gate:Bool2Int(self.oFA4.s)
  955.                     self.c = Gate:Bool2Int(self.oFA4.c)
  956.                 end,
  957.             New = function(self, obj, name)
  958.                     obj = obj or {}
  959.                     self.oFA1 = Gate.FULLADDER:New(nil, 'FA1')
  960.                     self.oFA2 = Gate.FULLADDER:New(nil, 'FA2')
  961.                     self.oFA3 = Gate.FULLADDER:New(nil, 'FA3')
  962.                     self.oFA4 = Gate.FULLADDER:New(nil, 'FA4')
  963.                     setmetatable(obj, self)
  964.                     self.__index = self
  965.                     if name ~= nil then obj.name = name end
  966.                     return obj
  967.                 end
  968.         },
  969.        
  970.         HALFSUBTRACTOR = {
  971.             class = 'HALFSUBTRACTOR',
  972.             name,
  973.             d,      -- difference
  974.             b,      -- borrow
  975.             oNOT1,
  976.             oNOT2,
  977.             oAND1,
  978.             oAND2,
  979.             oOR,
  980.             Set = function(self, a, b)
  981.                     self.oNOT1:Set(a)
  982.                     self.oNOT2:Set(b)
  983.                     self.oAND1:Set(b)
  984.                     self.oAND2:Set(nil, a)
  985.                     self.oOR:Set(self.oAND1.q, self.oAND2.q)
  986.                     self.b = Gate:Bool2Int(self.oAND1.q)
  987.                     self.d = Gate:Bool2Int(self.oOR.q)
  988.                 end,
  989.             New = function(self, obj, name)
  990.                     obj = obj or {}
  991.                     self.oNOT1 = Gate.NOT:New(nil, 'Not1-Halfsubtractor', true)
  992.                     self.oNOT2 = Gate.NOT:New(nil, 'Not2-Halfsubtractor', true)
  993.                     self.oAND1 = Gate.AND:New(nil, 'And1-Halfsubtractor')
  994.                     self.oAND2 = Gate.AND:New(nil, 'And2-Halfsubtractor')
  995.                     self.oOR = Gate.OR:New(nil, 'Or-Halfsubtractor')
  996.                     Gate:Wire(self.oNOT1, 'q', self.oAND1, 'b')
  997.                     Gate:Wire(self.oNOT2, 'q', self.oAND2, 'a')
  998.                     Gate:Wire(self.oAND1, 'q', self.oOR, 'b')
  999.                     Gate:Wire(self.oAND2, 'q', self.oOR, 'a')
  1000.                     setmetatable(obj, self)
  1001.                     self.__index = self
  1002.                     if name ~= nil then obj.name = name end
  1003.                     return obj
  1004.                 end
  1005.         },
  1006.        
  1007.         FULLSUBTRACTOR = {
  1008.             class = 'FULLSUBTRACTOR',
  1009.             name,
  1010.             d,      -- difference
  1011.             b,      -- borrow
  1012.             oSPLITa,
  1013.             oSPLITb1,
  1014.             oSPLITb2,
  1015.             oSPLITc1,
  1016.             oSPLITc2,
  1017.             oSPLIT_NOTa,
  1018.             oNOTa,
  1019.             oNOTb,
  1020.             oNOTc,
  1021.             oAND1b,
  1022.             oAND2b,
  1023.             oAND3b,
  1024.             o3AND1d, -- AND_TRIPLE
  1025.             oAND2d,
  1026.             oAND3d,
  1027.             o3ORb,   -- OR_TRIPLE
  1028.             o3ORd,   -- OR_TRIPLE
  1029.             Set = function(self, a, b, c_in)
  1030.                     self.oSPLITa:Set(a)
  1031.                     self.oSPLITb1:Set(b)
  1032.                     self.oSPLITc1:Set(c_in)
  1033.                     self.b = Gate:Bool2Int(self.o3ORb.q)
  1034.                     self.d = Gate:Bool2Int(self.o3ORd.q)
  1035.                 end,
  1036.             New = function(self, obj, name)
  1037.                     obj = obj or {}
  1038.                     self.oSPLITa = Gate.SPLIT:New(nil, 'SplitA-Fullsubtractor', true)
  1039.                     self.oSPLITb1 = Gate.SPLIT:New(nil, 'SplitB1-Fullsubtractor', true)
  1040.                     self.oSPLITb2 = Gate.SPLIT:New(nil, 'SplitB2-Fullsubtractor', true)
  1041.                     self.oSPLITc1 = Gate.SPLIT:New(nil, 'SplitC1-Fullsubtractor', true)
  1042.                     self.oSPLITc2 = Gate.SPLIT:New(nil, 'SplitC2-Fullsubtractor', true)
  1043.                     self.oSPLIT_NOTa = Gate.SPLIT:New(nil, 'Split-NotA-Fullsubtractor', true)
  1044.                     self.oSPLITa.b_is_out = true
  1045.                     self.oSPLITa.c_is_out = true
  1046.                     self.oSPLITb1.b_is_out = true
  1047.                     self.oSPLITb1.c_is_out = true
  1048.                     self.oSPLITb2.b_is_out = true
  1049.                     self.oSPLITc1.b_is_out = true
  1050.                     self.oSPLITc1.c_is_out = true
  1051.                     self.oSPLITc2.b_is_out = true
  1052.                     self.oSPLIT_NOTa.b_is_out = true
  1053.                     self.oSPLIT_NOTa.c_is_out = true
  1054.                     self.oNOTa = Gate.NOT:New(nil, 'NotA-Fullsubtractor', true)
  1055.                     self.oNOTb = Gate.NOT:New(nil, 'NotB-Fullsubtractor', true)
  1056.                     self.oNOTc = Gate.NOT:New(nil, 'NotC-Fullsubtractor', true)
  1057.                     self.oAND1b = Gate.AND:New(nil, 'And1-B-Fullsubtractor', true)
  1058.                     self.oAND2b = Gate.AND:New(nil, 'And2-B-Fullsubtractor', true)
  1059.                     self.oAND3b = Gate.AND:New(nil, 'And3-B-Fullsubtractor', true)
  1060.                     self.o3AND1d = Gate.AND_TRIPLE:New(nil, '3And1-D-Fullsubtractor', true)
  1061.                     self.oAND2d = Gate.AND:New(nil, 'And2-D-Fullsubtractor', true)
  1062.                     self.oAND3d = Gate.AND:New(nil, 'And3-D-Fullsubtractor', true)
  1063.                     self.o3ORb = Gate.OR_TRIPLE:New(nil, '3Or-B-Fullsubtractor')
  1064.                     self.o3ORd = Gate.OR_TRIPLE:New(nil, '3Or-D-Fullsubtractor')
  1065.                    
  1066.                     Gate:Wire(self.oSPLITa, 'b', self.oNOTa, 'a')
  1067.                     Gate:Wire(self.oSPLITa, 'c', self.oAND3d, 'a')
  1068.                     Gate:Wire(self.oSPLITa, 'q', self.oAND2d, 'b')
  1069.                    
  1070.                     Gate:Wire(self.oSPLITb1, 'b', self.oNOTb, 'a')
  1071.                     Gate:Wire(self.oSPLITb1, 'c', self.oAND3d, 'b')
  1072.                     Gate:Wire(self.oSPLITb1, 'q', self.oSPLITb2, 'a')
  1073.  
  1074.                     Gate:Wire(self.oSPLITb2, 'b', self.oAND1b, 'a')
  1075.                     Gate:Wire(self.oSPLITb2, 'q', self.oAND3b, 'b')
  1076.                    
  1077.                     Gate:Wire(self.oSPLITc1, 'b', self.oNOTc, 'a')
  1078.                     Gate:Wire(self.oSPLITc1, 'c', self.oSPLITc2, 'a')
  1079.                     Gate:Wire(self.oSPLITc1, 'q', self.o3AND1d, 'c')
  1080.  
  1081.                     Gate:Wire(self.oSPLITc2, 'b', self.oAND3b, 'a')
  1082.                     Gate:Wire(self.oSPLITc2, 'q', self.oAND2b, 'a')
  1083.                    
  1084.                     Gate:Wire(self.oNOTa, 'q', self.oSPLIT_NOTa, 'a')
  1085.                     Gate:Wire(self.oSPLIT_NOTa, 'b', self.oAND2b, 'b')
  1086.                     Gate:Wire(self.oSPLIT_NOTa, 'c', self.o3AND1d, 'a')
  1087.                     Gate:Wire(self.oSPLIT_NOTa, 'q', self.oAND1b, 'b')
  1088.                    
  1089.                     Gate:Wire(self.oNOTb, 'q', self.o3AND1d, 'b')
  1090.                    
  1091.                     Gate:Wire(self.oNOTc, 'q', self.oAND2d, 'a')
  1092.                    
  1093.                     Gate:Wire(self.oAND1b, 'q', self.o3ORb, 'a')
  1094.                     Gate:Wire(self.oAND2b, 'q', self.o3ORb, 'b')
  1095.                     Gate:Wire(self.oAND3b, 'q', self.o3ORb, 'c')
  1096.                    
  1097.                     Gate:Wire(self.o3AND1d, 'q', self.o3ORd, 'a')
  1098.                     Gate:Wire(self.oAND2d, 'q', self.o3ORd, 'b')
  1099.                     Gate:Wire(self.oAND3d, 'q', self.o3ORd, 'c')
  1100.                    
  1101.                     setmetatable(obj, self)
  1102.                     self.__index = self
  1103.                     if name ~= nil then obj.name = name end
  1104.                     return obj
  1105.                 end
  1106.         },
  1107.        
  1108.         ADDERSUBTR4BIT = {
  1109.             class = 'ADDERSUBTR4BIT',
  1110.             name,
  1111.             v, -- detecting overflow
  1112.             c,
  1113.             s1,
  1114.             s2,
  1115.             s3,
  1116.             s4,
  1117.             oFA1,
  1118.             oFA2,
  1119.             oFA3,
  1120.             oFA4,
  1121.             oXOR1,
  1122.             oXOR2,
  1123.             oXOR3,
  1124.             oXOR4,
  1125.             oXORv,
  1126.             Set = function(self, x1, x2, x3, x4, y1, y2, y3, y4, m_flag) -- m_flag: 0=adder, 1=subtractor
  1127.                     if m_flag == nil then m_flag = 0 end                 -- default: adder
  1128.                     self.oXOR1:Set(m_flag, y1)
  1129.                     self.oXOR2:Set(m_flag, y2)
  1130.                     self.oXOR3:Set(m_flag, y3)
  1131.                     self.oXOR4:Set(m_flag, y4)
  1132.                     self.oFA1:Set(x1, self.oXOR1.q, m_flag)
  1133.                     self.oFA2:Set(x2, self.oXOR2.q, self.oFA1.c)
  1134.                     self.oFA3:Set(x3, self.oXOR3.q, self.oFA2.c)
  1135.                     self.oFA4:Set(x4, self.oXOR4.q, self.oFA3.c)
  1136.                     self.oXORv:Set(self.oFA3.c, self.oFA4.c)
  1137.                     self.s1 = Gate:Bool2Int(self.oFA1.s)
  1138.                     self.s2 = Gate:Bool2Int(self.oFA2.s)
  1139.                     self.s3 = Gate:Bool2Int(self.oFA3.s)
  1140.                     self.s4 = Gate:Bool2Int(self.oFA4.s)
  1141.                     self.c = Gate:Bool2Int(self.oFA4.c)
  1142.                     self.v = Gate:Bool2Int(self.oXORv.q)
  1143.                 end,
  1144.             New = function(self, obj, name)
  1145.                     obj = obj or {}
  1146.                     self.oFA1 = Gate.FULLADDER:New(nil, 'FA1-Adder-Subtractor')
  1147.                     self.oFA2 = Gate.FULLADDER:New(nil, 'FA2-Adder-Subtractor')
  1148.                     self.oFA3 = Gate.FULLADDER:New(nil, 'FA3-Adder-Subtractor')
  1149.                     self.oFA4 = Gate.FULLADDER:New(nil, 'FA4-Adder-Subtractor')
  1150.                     self.oXOR1 = Gate.XOR:New(nil, 'XOR1-Adder-Subtractor', false)
  1151.                     self.oXOR2 = Gate.XOR:New(nil, 'XOR2-Adder-Subtractor', false)
  1152.                     self.oXOR3 = Gate.XOR:New(nil, 'XOR3-Adder-Subtractor', false)
  1153.                     self.oXOR4 = Gate.XOR:New(nil, 'XOR4-Adder-Subtractor', false)
  1154.                     self.oXORv = Gate.XOR:New(nil, 'XORv-Adder-Subtractor', false)
  1155.                     setmetatable(obj, self)
  1156.                     self.__index = self
  1157.                     if name ~= nil then obj.name = name end
  1158.                     return obj
  1159.                 end
  1160.         }
  1161.     }
  1162.     return Gate
  1163. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement