15 def __buildtempcnf__(variable_count, files, strlines):
16 """ Builds temporally file for cnf formulas
17 variable_count - number of variables in formulas
18 files - list of files with formulas
19 strlines - list of string lines with formulas"""
26 with open(file, 'r') as f:
28 lines.add(ln.rstrip())
30 first_line = "p cnf " + str(variable_count) + " " + str(len(lines))
32 wfile = tempfile.NamedTemporaryFile(delete=False)
33 wfile.write(bytes(first_line + '\n', 'UTF-8'))
35 wfile.write(bytes(ln + ' 0\n', 'UTF-8'))
39 def __exec_sat__(file, args):
40 """Executes SAT solver and returns configuration."""
41 picosat_cmd = [sf(conf.picosat), file]
42 picosat_cmd += conf.picosat_args
43 stdout = utils.callsubprocess('picosat', picosat_cmd, conf.picosat_output,
44 True, allow_all_exit_codes = True)
56 if not line.rstrip() == 's SATISFIABLE':
57 raise exceptions.NoSolution()
59 for sl in line[2:].split():
68 def __write_temp_config_file__(con, conf_num):
69 # Ensure smap existence
70 utils.build_symbol_map()
71 # Write temporally file
72 wfile = tempfile.NamedTemporaryFile(delete=False)
81 if 'NONAMEGEN' in utils.smap[s]: # ignore generated names
83 wfile.write(bytes('CONFIG_' + utils.smap[s] + '=',
84 sys.getdefaultencoding()))
86 wfile.write(bytes('y', sys.getdefaultencoding()))
88 wfile.write(bytes('n', sys.getdefaultencoding()))
89 wfile.write(bytes('\n', sys.getdefaultencoding()))
93 def __load_config_file__(file):
95 with open(file, 'r') as f:
97 if ln[0] == '#' or not '=' in ln:
100 if (ln[indx + 1] == 'y'):
101 rtn[ln[7:indx]] = True
103 rtn[ln[7:indx]] = False
106 def __calchash__(file):
107 """Calculates hash from configuration file"""
108 # Build hashconfigsort
111 with open(conf.hashconfigsort, 'r') as f:
113 csort.append(ln.rstrip())
114 except FileNotFoundError:
117 con = __load_config_file__(file)
127 csortfile = open(sf(conf.hashconfigsort), 'a');
128 for key, val in con.items():
134 csortfile.write(key + '\n')
139 hsh = hashlib.md5(bytes(cstr, 'UTF-8'))
140 return hsh.hexdigest()
142 def __register_conf__(con, conf_num, generator):
143 dtb = database.database()
144 # Solution to configuration
145 wfile = __write_temp_config_file__(con, conf_num)
146 hsh = __calchash__(wfile)
147 filen = os.path.join(sf(conf.configurations_folder), hsh)
149 if os.path.isfile(filen):
150 if compare(filen, wfile):
151 print("I: Generated existing configuration.")
154 print("W: Generated configuration with collision hash.")
155 # TODO this might have to be tweaked
157 shutil.move(wfile, filen)
158 dtb.add_configuration(hsh, hshf, generator)
161 def __generate_single__(var_num, conf_num):
163 if not os.path.isfile(sf(conf.single_generated_file)):
164 with open(sf(conf.measure_file), 'r') as fi:
166 measure_list.add(int(ln))
168 with open(sf(conf.single_generated_file), 'r') as f:
170 measure_list.add(int(ln))
173 tfile = __buildtempcnf__(var_num, (sf(conf.rules_file),
174 sf(conf.fixed_file)), (str(measure_list.pop())))
175 with open(sf(conf.single_generated_file), 'w') as fo:
176 fo.writelines(measure_list)
178 confs = __exec_sat__(tfile, ['-i', '0'])
180 __register_conf__(con, conf_num, 'single-sat')
181 except exceptions.NoSolution:
183 return __generate_single__(var_num, conf_num)
188 def __generate_random__(var_num, conf_num):
189 tfile = __buildtempcnf__(var_num, (sf(conf.rules_file), sf(conf.fixed_file)), ())
191 confs = __exec_sat__(tfile, ['-i', '3'])
193 if not __register_conf__(con, conf_num, 'random-sat'):
194 __generate_random__(var_num, conf_num)
200 """Collect boolean equations from files rules and required
201 And get solution with picosat
203 # Check if rules_file exist. If it was generated.
204 if not os.path.isfile(sf(conf.rules_file)):
205 raise exceptions.MissingFile(conf.rules_file,"Run parse_kconfig.")
206 if not os.path.isfile(sf(conf.fixed_file)):
207 raise exceptions.MissingFile(conf.required_file,"Run allconfig and initialization process.")
209 # Load variable count
210 with open(sf(conf.variable_count_file)) as f:
211 var_num = f.readline().rstrip()
212 conf_num = f.readline().rstrip()
214 if __generate_single__(var_num, conf_num):
216 elif __generate_random__(var_num, conf_num):
219 raise exceptions.NoNewConfiguration()
221 def compare(file1, file2):
222 """Compared two configuration"""
223 conf1 = __load_config_file__(file1)
224 conf2 = __load_config_file__(file2)
226 # This is not exactly best comparison method
227 for key, val in conf1.items():
229 if conf2[key] != val:
233 for key, val in conf2.items():
235 if conf1[key] != val: