Advertisement
Guest User

QMC Python

a guest
Sep 29th, 2012
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.96 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import sys
  4. import math
  5. import re
  6.  
  7.  
  8. def find_char_difference(str1, str2) :
  9.     if len(str1) != len(str2) :
  10.         return None;
  11.     counter = 0
  12.     index = -1
  13.     for i in range(len(str1)) :
  14.         if str1[i] != str2[i] :
  15.             counter += 1
  16.             index = i
  17.     if counter != 1 :
  18.         return None
  19.     return index
  20.  
  21. class Minterm :
  22.     def __init__(self, terms, rep) :
  23.         self.minterms = terms
  24.         self.binary = rep
  25.         self.done = False
  26.  
  27. def is_complete_table(table) :
  28.     for m in table :
  29.         if not m.done :
  30.             return False
  31.     return True
  32.  
  33.  
  34. def combine_terms(term1, term2) :
  35.     if term1.done or term2.done :
  36.         return None
  37.     index = find_char_difference(term1.binary, term2.binary)
  38.     if index == None :
  39.         return None
  40.     listterm = list(term1.binary)
  41.     listterm[index] = '-'
  42.     term = "".join(listterm)
  43.     newMin = Minterm(list(set(term1.minterms+term2.minterms)), term)
  44.     return newMin
  45.  
  46.  
  47. def is_contained_by(term1, term2) :
  48.     for i in term2.minterms :
  49.         if not i in term1.minterms :
  50.             return False
  51.     return True
  52.  
  53.  
  54. def imply_table(table) :
  55.     newTable = []
  56.     for m in range(len(table)) :
  57.         if table[m].done :
  58.             newTable.append(table[m])
  59.             continue
  60.         wasCombined = False
  61.         for n in range(m+1, len(table)) :
  62.             if table[m].minterms == table[n].minterms :
  63.                 continue
  64.             newTerm = combine_terms(table[m], table[n])
  65.             if not newTerm :
  66.                 continue
  67.             newTable.append(newTerm)
  68.             wasCombined = True
  69.        
  70.         table[m].done = not wasCombined
  71.         if table[m].done :
  72.             newTable.append(table[m])
  73.     m = 0
  74.     while m < len(newTable)-1 :
  75.         n = m+1
  76.         while n < len(newTable) :
  77.             if is_contained_by(newTable[m], newTable[n]) :
  78.                 del newTable[n]
  79.                 n-= 1
  80.             n+=1
  81.         m+=1
  82.     return newTable
  83.  
  84.  
  85. # read in and sanatize the data
  86. data = sys.stdin.read()
  87. data = re.sub(r'\s','',data)
  88. N = math.log(len(data),2)
  89. if N < 1 or N != int(N) :
  90.     sys.exit(0)
  91. N = int(N)
  92. print "N = " + `N`
  93. for c in data :
  94.     if c != '0' and c != '1' :
  95.         sys.exit(0)
  96. # create a mintable with all of the terms
  97. mintable = []
  98. minlist = []
  99. for i in range(0, len(data)) :
  100.     if data[i] == '1' :
  101.         mintable.append(Minterm([i], bin(i)[2:].zfill(N)))
  102.         minlist.append(i)
  103.  
  104. while not is_complete_table(mintable) :
  105.     mintable = imply_table(mintable)
  106.  
  107. print "NOTE: NOT FULLY REDUCED (NEEDS PRIME IMPLICATION)"
  108. string = "f(A"
  109. for i in range(1,N) :
  110.     string += "," + chr(65+i)
  111. string += ") = "
  112. for t in mintable :
  113.     for i in range(N) :
  114.         if t.binary[i] == '0' or t.binary[i] == '1' :
  115.             string += chr(65+i)
  116.             if t.binary[i] == '0' :
  117.                 string += "`"
  118.     string += " + "
  119. string = string[:-3]
  120. print string
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement