yosys-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SatHelper Struct Reference
+ Collaboration diagram for SatHelper:

Data Structures

struct  ModelBlockInfo
 

Public Member Functions

 SatHelper (RTLIL::Design *design, RTLIL::Module *module, bool enable_undef)
 
void check_undef_enabled (const RTLIL::SigSpec &sig)
 
void setup_init ()
 
void setup (int timestep=-1)
 
int setup_proof (int timestep=-1)
 
void force_unique_state (int timestep_from, int timestep_to)
 
bool solve (const std::vector< int > &assumptions)
 
bool solve (int a=0, int b=0, int c=0, int d=0, int e=0, int f=0)
 
void maximize_undefs ()
 
void generate_model ()
 
void print_model ()
 
void dump_model_to_vcd (std::string vcd_file_name)
 
void invalidate_model (bool max_undef)
 

Data Fields

RTLIL::Designdesign
 
RTLIL::Modulemodule
 
ezDefaultSAT ez
 
SigMap sigmap
 
CellTypes ct
 
SatGen satgen
 
std::vector< std::pair
< std::string, std::string > > 
sets
 
std::vector< std::pair
< std::string, std::string > > 
prove
 
std::vector< std::pair
< std::string, std::string > > 
prove_x
 
std::vector< std::pair
< std::string, std::string > > 
sets_init
 
std::map< int, std::vector
< std::pair< std::string,
std::string > > > 
sets_at
 
std::map< int, std::vector
< std::string > > 
unsets_at
 
bool prove_asserts
 
bool enable_undef
 
bool set_init_def
 
bool set_init_undef
 
bool set_init_zero
 
bool ignore_unknown_cells
 
std::vector< std::string > sets_def
 
std::vector< std::string > sets_any_undef
 
std::vector< std::string > sets_all_undef
 
std::map< int, std::vector
< std::string > > 
sets_def_at
 
std::map< int, std::vector
< std::string > > 
sets_any_undef_at
 
std::map< int, std::vector
< std::string > > 
sets_all_undef_at
 
std::vector< std::string > shows
 
SigPool show_signal_pool
 
SigSet< RTLIL::Cell * > show_drivers
 
int max_timestep
 
int timeout
 
bool gotTimeout
 
std::vector< int > modelExpressions
 
std::vector< bool > modelValues
 
std::set< ModelBlockInfomodelInfo
 

Detailed Description

Definition at line 39 of file sat.cc.

Constructor & Destructor Documentation

SatHelper::SatHelper ( RTLIL::Design design,
RTLIL::Module module,
bool  enable_undef 
)
inline

Definition at line 67 of file sat.cc.

67  :
68  design(design), module(module), sigmap(module), ct(design), satgen(&ez, &sigmap)
69  {
70  this->enable_undef = enable_undef;
72  set_init_def = false;
73  set_init_undef = false;
74  set_init_zero = false;
75  ignore_unknown_cells = false;
76  max_timestep = -1;
77  timeout = 0;
78  gotTimeout = false;
79  }
CellTypes ct
Definition: sat.cc:46
bool set_init_zero
Definition: sat.cc:56
bool set_init_undef
Definition: sat.cc:56
bool ignore_unknown_cells
Definition: sat.cc:56
bool model_undef
Definition: satgen.h:43
bool gotTimeout
Definition: sat.cc:65
bool enable_undef
Definition: sat.cc:56
SigMap sigmap
Definition: sat.cc:45
ezDefaultSAT ez
Definition: sat.cc:44
SatGen satgen
Definition: sat.cc:47
int max_timestep
Definition: sat.cc:64
bool set_init_def
Definition: sat.cc:56
int timeout
Definition: sat.cc:64
RTLIL::Module * module
Definition: sat.cc:42
RTLIL::Design * design
Definition: sat.cc:41

Member Function Documentation

void SatHelper::check_undef_enabled ( const RTLIL::SigSpec sig)
inline

Definition at line 81 of file sat.cc.

82  {
83  if (enable_undef)
84  return;
85 
86  std::vector<RTLIL::SigBit> sigbits = sig.to_sigbit_vector();
87  for (size_t i = 0; i < sigbits.size(); i++)
88  if (sigbits[i].wire == NULL && sigbits[i].data == RTLIL::State::Sx)
89  log_cmd_error("Bit %d of %s is undef but option -enable_undef is missing!\n", int(i), log_signal(sig));
90  }
const char * log_signal(const RTLIL::SigSpec &sig, bool autoint)
Definition: log.cc:269
bool enable_undef
Definition: sat.cc:56
void log_cmd_error(const char *format,...)
Definition: log.cc:211
#define NULL
std::vector< RTLIL::SigBit > to_sigbit_vector() const
Definition: rtlil.cc:2921

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::dump_model_to_vcd ( std::string  vcd_file_name)
inline

Definition at line 650 of file sat.cc.

651  {
652  FILE *f = fopen(vcd_file_name.c_str(), "w");
653  if (!f)
654  log_cmd_error("Can't open output file `%s' for writing: %s\n", vcd_file_name.c_str(), strerror(errno));
655 
656  log("Dumping SAT model to VCD file %s\n", vcd_file_name.c_str());
657 
658  time_t timestamp;
659  struct tm* now;
660  char stime[128] = {};
661  time(&timestamp);
662  now = localtime(&timestamp);
663  strftime(stime, sizeof(stime), "%c", now);
664 
665  std::string module_fname = "unknown";
666  auto apos = module->attributes.find("\\src");
667  if(apos != module->attributes.end())
668  module_fname = module->attributes["\\src"].decode_string();
669 
670  fprintf(f, "$date\n");
671  fprintf(f, " %s\n", stime);
672  fprintf(f, "$end\n");
673  fprintf(f, "$version\n");
674  fprintf(f, " Generated by %s\n", yosys_version_str);
675  fprintf(f, "$end\n");
676  fprintf(f, "$comment\n");
677  fprintf(f, " Generated from SAT problem in module %s (declared at %s)\n",
678  module->name.c_str(), module_fname.c_str());
679  fprintf(f, "$end\n");
680 
681  // VCD has some limits on internal (non-display) identifier names, so make legal ones
682  std::map<std::string, std::string> vcdnames;
683 
684  fprintf(f, "$timescale 1ns\n"); // arbitrary time scale since actual clock period is unknown/unimportant
685  fprintf(f, "$scope module %s $end\n", module->name.c_str());
686  for (auto &info : modelInfo)
687  {
688  if (vcdnames.find(info.description) != vcdnames.end())
689  continue;
690 
691  char namebuf[16];
692  snprintf(namebuf, sizeof(namebuf), "v%d", static_cast<int>(vcdnames.size()));
693  vcdnames[info.description] = namebuf;
694 
695  // Even display identifiers can't use some special characters
696  std::string legal_desc = info.description.c_str();
697  for (auto &c : legal_desc) {
698  if(c == '$')
699  c = '_';
700  if(c == ':')
701  c = '_';
702  }
703 
704  fprintf(f, "$var wire %d %s %s $end\n", info.width, namebuf, legal_desc.c_str());
705 
706  // Need to look at first *two* cycles!
707  // We need to put a name on all variables but those without an initialization clause
708  // have no value at timestep 0
709  if(info.timestep > 1)
710  break;
711  }
712  fprintf(f, "$upscope $end\n");
713  fprintf(f, "$enddefinitions $end\n");
714  fprintf(f, "$dumpvars\n");
715 
716  static const char bitvals[] = "01xzxx";
717 
718  int last_timestep = -2;
719  for (auto &info : modelInfo)
720  {
721  RTLIL::Const value;
722 
723  for (int i = 0; i < info.width; i++) {
724  value.bits.push_back(modelValues.at(info.offset+i) ? RTLIL::State::S1 : RTLIL::State::S0);
725  if (enable_undef && modelValues.at(modelExpressions.size()/2 + info.offset + i))
726  value.bits.back() = RTLIL::State::Sx;
727  }
728 
729  if (info.timestep != last_timestep) {
730  if(last_timestep == 0)
731  fprintf(f, "$end\n");
732  else
733  fprintf(f, "#%d\n", info.timestep);
734  last_timestep = info.timestep;
735  }
736 
737  if(info.width == 1) {
738  fprintf(f, "%c%s\n", bitvals[value.bits[0]], vcdnames[info.description].c_str());
739  } else {
740  fprintf(f, "b");
741  for(int k=info.width-1; k >= 0; k --) //need to flip bit ordering for VCD
742  fprintf(f, "%c", bitvals[value.bits[k]]);
743  fprintf(f, " %s\n", vcdnames[info.description].c_str());
744  }
745  }
746 
747  if (last_timestep == -2)
748  log(" no model variables selected for display.\n");
749 
750  fclose(f);
751  }
const char * yosys_version_str
const char * c_str() const
Definition: rtlil.h:178
std::vector< bool > modelValues
Definition: sat.cc:462
std::vector< int > modelExpressions
Definition: sat.cc:461
bool enable_undef
Definition: sat.cc:56
RTLIL::IdString name
Definition: rtlil.h:599
void log_cmd_error(const char *format,...)
Definition: log.cc:211
void log(const char *format,...)
Definition: log.cc:180
std::vector< RTLIL::State > bits
Definition: rtlil.h:438
RTLIL::Module * module
Definition: sat.cc:42
std::set< ModelBlockInfo > modelInfo
Definition: sat.cc:463

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::force_unique_state ( int  timestep_from,
int  timestep_to 
)
inline

Definition at line 418 of file sat.cc.

419  {
420  RTLIL::SigSpec state_signals = satgen.initial_state.export_all();
421  for (int i = timestep_from; i < timestep_to; i++)
422  ez.assume(ez.NOT(satgen.signals_eq(state_signals, state_signals, i, timestep_to)));
423  }
SigPool initial_state
Definition: satgen.h:39
RTLIL::SigSpec export_all()
Definition: sigtools.h:123
ezDefaultSAT ez
Definition: sat.cc:44
SatGen satgen
Definition: sat.cc:47
int signals_eq(RTLIL::SigSpec lhs, RTLIL::SigSpec rhs, int timestep_lhs=-1, int timestep_rhs=-1)
Definition: satgen.h:134

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::generate_model ( )
inline

Definition at line 488 of file sat.cc.

489  {
490  RTLIL::SigSpec modelSig;
491  modelExpressions.clear();
492  modelInfo.clear();
493 
494  // Add "show" signals or alternatively the leaves on the input cone on all set and prove signals
495 
496  if (shows.size() == 0)
497  {
498  SigPool queued_signals, handled_signals, final_signals;
499  queued_signals = show_signal_pool;
500  while (queued_signals.size() > 0) {
501  RTLIL::SigSpec sig = queued_signals.export_one();
502  queued_signals.del(sig);
503  handled_signals.add(sig);
504  std::set<RTLIL::Cell*> drivers = show_drivers.find(sig);
505  if (drivers.size() == 0) {
506  final_signals.add(sig);
507  } else {
508  for (auto &d : drivers)
509  for (auto &p : d->connections()) {
510  if (d->type == "$dff" && p.first == "\\CLK")
511  continue;
512  if (d->type.substr(0, 6) == "$_DFF_" && p.first == "\\C")
513  continue;
514  queued_signals.add(handled_signals.remove(sigmap(p.second)));
515  }
516  }
517  }
518  modelSig = final_signals.export_all();
519 
520  // additionally add all set and prove signals directly
521  // (it improves user confidence if we write the constraints back ;-)
522  modelSig.append(show_signal_pool.export_all());
523  }
524  else
525  {
526  for (auto &s : shows) {
527  RTLIL::SigSpec sig;
528  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
529  log_cmd_error("Failed to parse show expression `%s'.\n", s.c_str());
530  log("Import show expression: %s\n", log_signal(sig));
531  modelSig.append(sig);
532  }
533  }
534 
535  modelSig.sort_and_unify();
536  // log("Model signals: %s\n", log_signal(modelSig));
537 
538  std::vector<int> modelUndefExpressions;
539 
540  for (auto &c : modelSig.chunks())
541  if (c.wire != NULL)
542  {
543  ModelBlockInfo info;
544  RTLIL::SigSpec chunksig = c;
545  info.width = chunksig.size();
546  info.description = log_signal(chunksig);
547 
548  for (int timestep = -1; timestep <= max_timestep; timestep++)
549  {
550  if ((timestep == -1 && max_timestep > 0) || timestep == 0)
551  continue;
552 
553  info.timestep = timestep;
554  info.offset = modelExpressions.size();
555  modelInfo.insert(info);
556 
557  std::vector<int> vec = satgen.importSigSpec(chunksig, timestep);
558  modelExpressions.insert(modelExpressions.end(), vec.begin(), vec.end());
559 
560  if (enable_undef) {
561  std::vector<int> undef_vec = satgen.importUndefSigSpec(chunksig, timestep);
562  modelUndefExpressions.insert(modelUndefExpressions.end(), undef_vec.begin(), undef_vec.end());
563  }
564  }
565  }
566 
567  // Add initial state signals as collected by satgen
568  //
569  modelSig = satgen.initial_state.export_all();
570  for (auto &c : modelSig.chunks())
571  if (c.wire != NULL)
572  {
573  ModelBlockInfo info;
574  RTLIL::SigSpec chunksig = c;
575 
576  info.timestep = 0;
577  info.offset = modelExpressions.size();
578  info.width = chunksig.size();
579  info.description = log_signal(chunksig);
580  modelInfo.insert(info);
581 
582  std::vector<int> vec = satgen.importSigSpec(chunksig, 1);
583  modelExpressions.insert(modelExpressions.end(), vec.begin(), vec.end());
584 
585  if (enable_undef) {
586  std::vector<int> undef_vec = satgen.importUndefSigSpec(chunksig, 1);
587  modelUndefExpressions.insert(modelUndefExpressions.end(), undef_vec.begin(), undef_vec.end());
588  }
589  }
590 
591  modelExpressions.insert(modelExpressions.end(), modelUndefExpressions.begin(), modelUndefExpressions.end());
592  }
size_t size()
Definition: sigtools.h:131
RTLIL::SigSpec export_one()
Definition: sigtools.h:116
static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3058
SigPool initial_state
Definition: satgen.h:39
const char * log_signal(const RTLIL::SigSpec &sig, bool autoint)
Definition: log.cc:269
std::vector< int > importSigSpec(RTLIL::SigSpec sig, int timestep=-1)
Definition: satgen.h:78
int size() const
Definition: rtlil.h:1019
std::vector< std::string > shows
Definition: sat.cc:61
SigSet< RTLIL::Cell * > show_drivers
Definition: sat.cc:63
std::vector< int > importUndefSigSpec(RTLIL::SigSpec sig, int timestep=-1)
Definition: satgen.h:92
std::vector< int > modelExpressions
Definition: sat.cc:461
bool enable_undef
Definition: sat.cc:56
RTLIL::SigSpec export_all()
Definition: sigtools.h:123
SigMap sigmap
Definition: sat.cc:45
SatGen satgen
Definition: sat.cc:47
RTLIL::SigSpec remove(RTLIL::SigSpec sig)
Definition: sigtools.h:86
void log_cmd_error(const char *format,...)
Definition: log.cc:211
SigPool show_signal_pool
Definition: sat.cc:62
int max_timestep
Definition: sat.cc:64
void add(RTLIL::SigSpec sig)
Definition: sigtools.h:41
void sort_and_unify()
Definition: rtlil.cc:2291
#define NULL
void log(const char *format,...)
Definition: log.cc:180
RTLIL::Module * module
Definition: sat.cc:42
void append(const RTLIL::SigSpec &signal)
Definition: rtlil.cc:2523
void del(RTLIL::SigSpec sig)
Definition: sigtools.h:54
RTLIL::Design * design
Definition: sat.cc:41
std::set< ModelBlockInfo > modelInfo
Definition: sat.cc:463
void find(RTLIL::SigSpec sig, std::set< T > &result)
Definition: sigtools.h:187
const std::vector< RTLIL::SigChunk > & chunks() const
Definition: rtlil.h:1016

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::invalidate_model ( bool  max_undef)
inline

Definition at line 753 of file sat.cc.

754  {
755  std::vector<int> clause;
756  if (enable_undef) {
757  for (size_t i = 0; i < modelExpressions.size()/2; i++) {
758  int bit = modelExpressions.at(i), bit_undef = modelExpressions.at(modelExpressions.size()/2 + i);
759  bool val = modelValues.at(i), val_undef = modelValues.at(modelExpressions.size()/2 + i);
760  if (!max_undef || !val_undef)
761  clause.push_back(val_undef ? ez.NOT(bit_undef) : val ? ez.NOT(bit) : bit);
762  }
763  } else
764  for (size_t i = 0; i < modelExpressions.size(); i++)
765  clause.push_back(modelValues.at(i) ? ez.NOT(modelExpressions.at(i)) : modelExpressions.at(i));
766  ez.assume(ez.expression(ezSAT::OpOr, clause));
767  }
std::vector< bool > modelValues
Definition: sat.cc:462
std::vector< int > modelExpressions
Definition: sat.cc:461
bool enable_undef
Definition: sat.cc:56
ezDefaultSAT ez
Definition: sat.cc:44

+ Here is the caller graph for this function:

void SatHelper::maximize_undefs ( )
inline

Definition at line 465 of file sat.cc.

466  {
468  std::vector<bool> backupValues;
469 
470  while (1)
471  {
472  std::vector<int> must_undef, maybe_undef;
473 
474  for (size_t i = 0; i < modelExpressions.size()/2; i++)
475  if (modelValues.at(modelExpressions.size()/2 + i))
476  must_undef.push_back(modelExpressions.at(modelExpressions.size()/2 + i));
477  else
478  maybe_undef.push_back(modelExpressions.at(modelExpressions.size()/2 + i));
479 
480  backupValues.swap(modelValues);
481  if (!solve(ez.expression(ezSAT::OpAnd, must_undef), ez.expression(ezSAT::OpOr, maybe_undef)))
482  break;
483  }
484 
485  backupValues.swap(modelValues);
486  }
std::vector< bool > modelValues
Definition: sat.cc:462
std::vector< int > modelExpressions
Definition: sat.cc:461
bool solve(const std::vector< int > &assumptions)
Definition: sat.cc:425
#define log_assert(_assert_expr_)
Definition: log.h:85
bool enable_undef
Definition: sat.cc:56
ezDefaultSAT ez
Definition: sat.cc:44

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::print_model ( )
inline

Definition at line 594 of file sat.cc.

595  {
596  int maxModelName = 10;
597  int maxModelWidth = 10;
598 
599  for (auto &info : modelInfo) {
600  maxModelName = std::max(maxModelName, int(info.description.size()));
601  maxModelWidth = std::max(maxModelWidth, info.width);
602  }
603 
604  log("\n");
605 
606  int last_timestep = -2;
607  for (auto &info : modelInfo)
608  {
609  RTLIL::Const value;
610  bool found_undef = false;
611 
612  for (int i = 0; i < info.width; i++) {
613  value.bits.push_back(modelValues.at(info.offset+i) ? RTLIL::State::S1 : RTLIL::State::S0);
614  if (enable_undef && modelValues.at(modelExpressions.size()/2 + info.offset + i))
615  value.bits.back() = RTLIL::State::Sx, found_undef = true;
616  }
617 
618  if (info.timestep != last_timestep) {
619  const char *hline = "---------------------------------------------------------------------------------------------------"
620  "---------------------------------------------------------------------------------------------------"
621  "---------------------------------------------------------------------------------------------------";
622  if (last_timestep == -2) {
623  log(max_timestep > 0 ? " Time " : " ");
624  log("%-*s %10s %10s %*s\n", maxModelName+10, "Signal Name", "Dec", "Hex", maxModelWidth+5, "Bin");
625  }
626  log(max_timestep > 0 ? " ---- " : " ");
627  log("%*.*s %10.10s %10.10s %*.*s\n", maxModelName+10, maxModelName+10,
628  hline, hline, hline, maxModelWidth+5, maxModelWidth+5, hline);
629  last_timestep = info.timestep;
630  }
631 
632  if (max_timestep > 0) {
633  if (info.timestep > 0)
634  log(" %4d ", info.timestep);
635  else
636  log(" init ");
637  } else
638  log(" ");
639 
640  if (info.width <= 32 && !found_undef)
641  log("%-*s %10d %10x %*s\n", maxModelName+10, info.description.c_str(), value.as_int(), value.as_int(), maxModelWidth+5, value.as_string().c_str());
642  else
643  log("%-*s %10s %10s %*s\n", maxModelName+10, info.description.c_str(), "--", "--", maxModelWidth+5, value.as_string().c_str());
644  }
645 
646  if (last_timestep == -2)
647  log(" no model variables selected for display.\n");
648  }
std::vector< bool > modelValues
Definition: sat.cc:462
std::vector< int > modelExpressions
Definition: sat.cc:461
std::string as_string() const
Definition: rtlil.cc:116
bool enable_undef
Definition: sat.cc:56
int as_int(bool is_signed=false) const
Definition: rtlil.cc:104
int max_timestep
Definition: sat.cc:64
void log(const char *format,...)
Definition: log.cc:180
std::vector< RTLIL::State > bits
Definition: rtlil.h:438
std::set< ModelBlockInfo > modelInfo
Definition: sat.cc:463

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::setup ( int  timestep = -1)
inline

Definition at line 185 of file sat.cc.

186  {
187  if (timestep > 0)
188  log ("\nSetting up time step %d:\n", timestep);
189  else
190  log ("\nSetting up SAT problem:\n");
191 
192  if (timestep > max_timestep)
193  max_timestep = timestep;
194 
195  RTLIL::SigSpec big_lhs, big_rhs;
196 
197  for (auto &s : sets)
198  {
199  RTLIL::SigSpec lhs, rhs;
200 
201  if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
202  log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.first.c_str());
203  if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
204  log_cmd_error("Failed to parse rhs set expression `%s'.\n", s.second.c_str());
207 
208  if (lhs.size() != rhs.size())
209  log_cmd_error("Set expression with different lhs and rhs sizes: %s (%s, %d bits) vs. %s (%s, %d bits)\n",
210  s.first.c_str(), log_signal(lhs), lhs.size(), s.second.c_str(), log_signal(rhs), rhs.size());
211 
212  log("Import set-constraint: %s = %s\n", log_signal(lhs), log_signal(rhs));
213  big_lhs.remove2(lhs, &big_rhs);
214  big_lhs.append(lhs);
215  big_rhs.append(rhs);
216  }
217 
218  for (auto &s : sets_at[timestep])
219  {
220  RTLIL::SigSpec lhs, rhs;
221 
222  if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
223  log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.first.c_str());
224  if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
225  log_cmd_error("Failed to parse rhs set expression `%s'.\n", s.second.c_str());
228 
229  if (lhs.size() != rhs.size())
230  log_cmd_error("Set expression with different lhs and rhs sizes: %s (%s, %d bits) vs. %s (%s, %d bits)\n",
231  s.first.c_str(), log_signal(lhs), lhs.size(), s.second.c_str(), log_signal(rhs), rhs.size());
232 
233  log("Import set-constraint for this timestep: %s = %s\n", log_signal(lhs), log_signal(rhs));
234  big_lhs.remove2(lhs, &big_rhs);
235  big_lhs.append(lhs);
236  big_rhs.append(rhs);
237  }
238 
239  for (auto &s : unsets_at[timestep])
240  {
241  RTLIL::SigSpec lhs;
242 
243  if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s))
244  log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.c_str());
246 
247  log("Import unset-constraint for this timestep: %s\n", log_signal(lhs));
248  big_lhs.remove2(lhs, &big_rhs);
249  }
250 
251  log("Final constraint equation: %s = %s\n", log_signal(big_lhs), log_signal(big_rhs));
252  check_undef_enabled(big_lhs), check_undef_enabled(big_rhs);
253  ez.assume(satgen.signals_eq(big_lhs, big_rhs, timestep));
254 
255  // 0 = sets_def
256  // 1 = sets_any_undef
257  // 2 = sets_all_undef
258  std::set<RTLIL::SigSpec> sets_def_undef[3];
259 
260  for (auto &s : sets_def) {
261  RTLIL::SigSpec sig;
262  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
263  log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
264  sets_def_undef[0].insert(sig);
265  }
266 
267  for (auto &s : sets_any_undef) {
268  RTLIL::SigSpec sig;
269  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
270  log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
271  sets_def_undef[1].insert(sig);
272  }
273 
274  for (auto &s : sets_all_undef) {
275  RTLIL::SigSpec sig;
276  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
277  log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
278  sets_def_undef[2].insert(sig);
279  }
280 
281  for (auto &s : sets_def_at[timestep]) {
282  RTLIL::SigSpec sig;
283  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
284  log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
285  sets_def_undef[0].insert(sig);
286  sets_def_undef[1].erase(sig);
287  sets_def_undef[2].erase(sig);
288  }
289 
290  for (auto &s : sets_any_undef_at[timestep]) {
291  RTLIL::SigSpec sig;
292  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
293  log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
294  sets_def_undef[0].erase(sig);
295  sets_def_undef[1].insert(sig);
296  sets_def_undef[2].erase(sig);
297  }
298 
299  for (auto &s : sets_all_undef_at[timestep]) {
300  RTLIL::SigSpec sig;
301  if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
302  log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
303  sets_def_undef[0].erase(sig);
304  sets_def_undef[1].erase(sig);
305  sets_def_undef[2].insert(sig);
306  }
307 
308  for (int t = 0; t < 3; t++)
309  for (auto &sig : sets_def_undef[t]) {
310  log("Import %s constraint for this timestep: %s\n", t == 0 ? "def" : t == 1 ? "any_undef" : "all_undef", log_signal(sig));
311  std::vector<int> undef_sig = satgen.importUndefSigSpec(sig, timestep);
312  if (t == 0)
313  ez.assume(ez.NOT(ez.expression(ezSAT::OpOr, undef_sig)));
314  if (t == 1)
315  ez.assume(ez.expression(ezSAT::OpOr, undef_sig));
316  if (t == 2)
317  ez.assume(ez.expression(ezSAT::OpAnd, undef_sig));
318  }
319 
320  int import_cell_counter = 0;
321  for (auto &c : module->cells_)
322  if (design->selected(module, c.second)) {
323  // log("Import cell: %s\n", RTLIL::id2cstr(c.first));
324  if (satgen.importCell(c.second, timestep)) {
325  for (auto &p : c.second->connections())
326  if (ct.cell_output(c.second->type, p.first))
327  show_drivers.insert(sigmap(p.second), c.second);
328  import_cell_counter++;
329  } else if (ignore_unknown_cells)
330  log_warning("Failed to import cell %s (type %s) to SAT database.\n", RTLIL::id2cstr(c.first), RTLIL::id2cstr(c.second->type));
331  else
332  log_error("Failed to import cell %s (type %s) to SAT database.\n", RTLIL::id2cstr(c.first), RTLIL::id2cstr(c.second->type));
333  }
334  log("Imported %d cells to SAT database.\n", import_cell_counter);
335  }
bool selected(T1 *module) const
Definition: rtlil.h:551
CellTypes ct
Definition: sat.cc:46
void log_warning(const char *format,...)
Definition: log.cc:196
static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3058
const char * log_signal(const RTLIL::SigSpec &sig, bool autoint)
Definition: log.cc:269
std::vector< std::string > sets_all_undef
Definition: sat.cc:57
void log_error(const char *format,...)
Definition: log.cc:204
int size() const
Definition: rtlil.h:1019
bool ignore_unknown_cells
Definition: sat.cc:56
std::map< int, std::vector< std::pair< std::string, std::string > > > sets_at
Definition: sat.cc:51
SigSet< RTLIL::Cell * > show_drivers
Definition: sat.cc:63
std::vector< int > importUndefSigSpec(RTLIL::SigSpec sig, int timestep=-1)
Definition: satgen.h:92
std::vector< std::string > sets_any_undef
Definition: sat.cc:57
bool cell_output(RTLIL::IdString type, RTLIL::IdString port)
Definition: celltypes.h:193
std::map< int, std::vector< std::string > > sets_any_undef_at
Definition: sat.cc:58
SigMap sigmap
Definition: sat.cc:45
void remove2(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other)
Definition: rtlil.cc:2353
ezDefaultSAT ez
Definition: sat.cc:44
SatGen satgen
Definition: sat.cc:47
static const char * id2cstr(const RTLIL::IdString &str)
Definition: rtlil.h:267
std::vector< std::pair< std::string, std::string > > sets
Definition: sat.cc:50
void log_cmd_error(const char *format,...)
Definition: log.cc:211
SigPool show_signal_pool
Definition: sat.cc:62
int max_timestep
Definition: sat.cc:64
void add(RTLIL::SigSpec sig)
Definition: sigtools.h:41
std::map< RTLIL::IdString, RTLIL::Cell * > cells_
Definition: rtlil.h:596
void log(const char *format,...)
Definition: log.cc:180
bool importCell(RTLIL::Cell *cell, int timestep=-1)
Definition: satgen.h:203
std::map< int, std::vector< std::string > > sets_def_at
Definition: sat.cc:58
RTLIL::Module * module
Definition: sat.cc:42
void append(const RTLIL::SigSpec &signal)
Definition: rtlil.cc:2523
static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3078
RTLIL::Design * design
Definition: sat.cc:41
std::map< int, std::vector< std::string > > unsets_at
Definition: sat.cc:52
void insert(RTLIL::SigSpec sig, T data)
Definition: sigtools.h:152
std::vector< std::string > sets_def
Definition: sat.cc:57
int signals_eq(RTLIL::SigSpec lhs, RTLIL::SigSpec rhs, int timestep_lhs=-1, int timestep_rhs=-1)
Definition: satgen.h:134
std::map< int, std::vector< std::string > > sets_all_undef_at
Definition: sat.cc:58
void check_undef_enabled(const RTLIL::SigSpec &sig)
Definition: sat.cc:81

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void SatHelper::setup_init ( )
inline

Definition at line 92 of file sat.cc.

93  {
94  log ("\nSetting up initial state:\n");
95 
96  RTLIL::SigSpec big_lhs, big_rhs;
97 
98  for (auto &it : module->wires_)
99  {
100  if (it.second->attributes.count("\\init") == 0)
101  continue;
102 
103  RTLIL::SigSpec lhs = sigmap(it.second);
104  RTLIL::SigSpec rhs = it.second->attributes.at("\\init");
105  log_assert(lhs.size() == rhs.size());
106 
107  RTLIL::SigSpec removed_bits;
108  for (int i = 0; i < lhs.size(); i++) {
109  RTLIL::SigSpec bit = lhs.extract(i, 1);
110  if (!satgen.initial_state.check_all(bit)) {
111  removed_bits.append(bit);
112  lhs.remove(i, 1);
113  rhs.remove(i, 1);
114  i--;
115  }
116  }
117 
118  if (removed_bits.size())
119  log_warning("ignoring initial value on non-register: %s\n", log_signal(removed_bits));
120 
121  if (lhs.size()) {
122  log("Import set-constraint from init attribute: %s = %s\n", log_signal(lhs), log_signal(rhs));
123  big_lhs.remove2(lhs, &big_rhs);
124  big_lhs.append(lhs);
125  big_rhs.append(rhs);
126  }
127  }
128 
129  for (auto &s : sets_init)
130  {
131  RTLIL::SigSpec lhs, rhs;
132 
133  if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
134  log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.first.c_str());
135  if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
136  log_cmd_error("Failed to parse rhs set expression `%s'.\n", s.second.c_str());
139 
140  if (lhs.size() != rhs.size())
141  log_cmd_error("Set expression with different lhs and rhs sizes: %s (%s, %d bits) vs. %s (%s, %d bits)\n",
142  s.first.c_str(), log_signal(lhs), lhs.size(), s.second.c_str(), log_signal(rhs), rhs.size());
143 
144  log("Import set-constraint: %s = %s\n", log_signal(lhs), log_signal(rhs));
145  big_lhs.remove2(lhs, &big_rhs);
146  big_lhs.append(lhs);
147  big_rhs.append(rhs);
148  }
149 
150  if (!satgen.initial_state.check_all(big_lhs)) {
151  RTLIL::SigSpec rem = satgen.initial_state.remove(big_lhs);
152  log_cmd_error("Found -set-init bits that are not part of the initial_state: %s\n", log_signal(rem));
153  }
154 
155  if (set_init_def) {
157  std::vector<int> undef_rem = satgen.importUndefSigSpec(rem, 1);
158  ez.assume(ez.NOT(ez.expression(ezSAT::OpOr, undef_rem)));
159  }
160 
161  if (set_init_undef) {
163  rem.remove(big_lhs);
164  big_lhs.append(rem);
165  big_rhs.append(RTLIL::SigSpec(RTLIL::State::Sx, rem.size()));
166  }
167 
168  if (set_init_zero) {
170  rem.remove(big_lhs);
171  big_lhs.append(rem);
172  big_rhs.append(RTLIL::SigSpec(RTLIL::State::S0, rem.size()));
173  }
174 
175  if (big_lhs.size() == 0) {
176  log("No constraints for initial state found.\n\n");
177  return;
178  }
179 
180  log("Final constraint equation: %s = %s\n\n", log_signal(big_lhs), log_signal(big_rhs));
181  check_undef_enabled(big_lhs), check_undef_enabled(big_rhs);
182  ez.assume(satgen.signals_eq(big_lhs, big_rhs, 1));
183  }
void log_warning(const char *format,...)
Definition: log.cc:196
bool set_init_zero
Definition: sat.cc:56
static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3058
SigPool initial_state
Definition: satgen.h:39
std::vector< std::pair< std::string, std::string > > sets_init
Definition: sat.cc:50
std::map< RTLIL::IdString, RTLIL::Wire * > wires_
Definition: rtlil.h:595
const char * log_signal(const RTLIL::SigSpec &sig, bool autoint)
Definition: log.cc:269
bool set_init_undef
Definition: sat.cc:56
int size() const
Definition: rtlil.h:1019
void remove(const RTLIL::SigSpec &pattern)
Definition: rtlil.cc:2342
std::vector< int > importUndefSigSpec(RTLIL::SigSpec sig, int timestep=-1)
Definition: satgen.h:92
#define log_assert(_assert_expr_)
Definition: log.h:85
RTLIL::SigSpec export_all()
Definition: sigtools.h:123
SigMap sigmap
Definition: sat.cc:45
void remove2(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other)
Definition: rtlil.cc:2353
ezDefaultSAT ez
Definition: sat.cc:44
SatGen satgen
Definition: sat.cc:47
bool check_all(RTLIL::SigSpec sig)
Definition: sigtools.h:108
RTLIL::SigSpec remove(RTLIL::SigSpec sig)
Definition: sigtools.h:86
void log_cmd_error(const char *format,...)
Definition: log.cc:211
SigPool show_signal_pool
Definition: sat.cc:62
void add(RTLIL::SigSpec sig)
Definition: sigtools.h:41
bool set_init_def
Definition: sat.cc:56
void log(const char *format,...)
Definition: log.cc:180
RTLIL::SigSpec extract(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec *other=NULL) const
Definition: rtlil.cc:2414
RTLIL::Module * module
Definition: sat.cc:42
void append(const RTLIL::SigSpec &signal)
Definition: rtlil.cc:2523
static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3078
RTLIL::Design * design
Definition: sat.cc:41
int signals_eq(RTLIL::SigSpec lhs, RTLIL::SigSpec rhs, int timestep_lhs=-1, int timestep_rhs=-1)
Definition: satgen.h:134
void check_undef_enabled(const RTLIL::SigSpec &sig)
Definition: sat.cc:81

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int SatHelper::setup_proof ( int  timestep = -1)
inline

Definition at line 337 of file sat.cc.

338  {
339  log_assert(prove.size() || prove_x.size() || prove_asserts);
340 
341  RTLIL::SigSpec big_lhs, big_rhs;
342  std::vector<int> prove_bits;
343 
344  if (prove.size() > 0)
345  {
346  for (auto &s : prove)
347  {
348  RTLIL::SigSpec lhs, rhs;
349 
350  if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
351  log_cmd_error("Failed to parse lhs proof expression `%s'.\n", s.first.c_str());
352  if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
353  log_cmd_error("Failed to parse rhs proof expression `%s'.\n", s.second.c_str());
356 
357  if (lhs.size() != rhs.size())
358  log_cmd_error("Proof expression with different lhs and rhs sizes: %s (%s, %d bits) vs. %s (%s, %d bits)\n",
359  s.first.c_str(), log_signal(lhs), lhs.size(), s.second.c_str(), log_signal(rhs), rhs.size());
360 
361  log("Import proof-constraint: %s = %s\n", log_signal(lhs), log_signal(rhs));
362  big_lhs.remove2(lhs, &big_rhs);
363  big_lhs.append(lhs);
364  big_rhs.append(rhs);
365  }
366 
367  log("Final proof equation: %s = %s\n", log_signal(big_lhs), log_signal(big_rhs));
368  check_undef_enabled(big_lhs), check_undef_enabled(big_rhs);
369  prove_bits.push_back(satgen.signals_eq(big_lhs, big_rhs, timestep));
370  }
371 
372  if (prove_x.size() > 0)
373  {
374  for (auto &s : prove_x)
375  {
376  RTLIL::SigSpec lhs, rhs;
377 
378  if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
379  log_cmd_error("Failed to parse lhs proof-x expression `%s'.\n", s.first.c_str());
380  if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
381  log_cmd_error("Failed to parse rhs proof-x expression `%s'.\n", s.second.c_str());
384 
385  if (lhs.size() != rhs.size())
386  log_cmd_error("Proof-x expression with different lhs and rhs sizes: %s (%s, %d bits) vs. %s (%s, %d bits)\n",
387  s.first.c_str(), log_signal(lhs), lhs.size(), s.second.c_str(), log_signal(rhs), rhs.size());
388 
389  log("Import proof-x-constraint: %s = %s\n", log_signal(lhs), log_signal(rhs));
390  big_lhs.remove2(lhs, &big_rhs);
391  big_lhs.append(lhs);
392  big_rhs.append(rhs);
393  }
394 
395  log("Final proof-x equation: %s = %s\n", log_signal(big_lhs), log_signal(big_rhs));
396 
397  std::vector<int> value_lhs = satgen.importDefSigSpec(big_lhs, timestep);
398  std::vector<int> value_rhs = satgen.importDefSigSpec(big_rhs, timestep);
399 
400  std::vector<int> undef_lhs = satgen.importUndefSigSpec(big_lhs, timestep);
401  std::vector<int> undef_rhs = satgen.importUndefSigSpec(big_rhs, timestep);
402 
403  for (size_t i = 0; i < value_lhs.size(); i++)
404  prove_bits.push_back(ez.OR(undef_lhs.at(i), ez.AND(ez.NOT(undef_rhs.at(i)), ez.NOT(ez.XOR(value_lhs.at(i), value_rhs.at(i))))));
405  }
406 
407  if (prove_asserts) {
408  RTLIL::SigSpec asserts_a, asserts_en;
409  satgen.getAsserts(asserts_a, asserts_en, timestep);
410  for (int i = 0; i < GetSize(asserts_a); i++)
411  log("Import proof for assert: %s when %s.\n", log_signal(asserts_a[i]), log_signal(asserts_en[i]));
412  prove_bits.push_back(satgen.importAsserts(timestep));
413  }
414 
415  return ez.expression(ezSAT::OpAnd, prove_bits);
416  }
int importAsserts(int timestep=-1)
Definition: satgen.h:120
static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3058
bool prove_asserts
Definition: sat.cc:53
const char * log_signal(const RTLIL::SigSpec &sig, bool autoint)
Definition: log.cc:269
int size() const
Definition: rtlil.h:1019
void getAsserts(RTLIL::SigSpec &sig_a, RTLIL::SigSpec &sig_en, int timestep=-1)
Definition: satgen.h:113
std::vector< int > importUndefSigSpec(RTLIL::SigSpec sig, int timestep=-1)
Definition: satgen.h:92
std::vector< int > importDefSigSpec(RTLIL::SigSpec sig, int timestep=-1)
Definition: satgen.h:85
int GetSize(RTLIL::Wire *wire)
Definition: yosys.cc:334
#define log_assert(_assert_expr_)
Definition: log.h:85
SigMap sigmap
Definition: sat.cc:45
ezDefaultSAT ez
Definition: sat.cc:44
SatGen satgen
Definition: sat.cc:47
void log_cmd_error(const char *format,...)
Definition: log.cc:211
SigPool show_signal_pool
Definition: sat.cc:62
void add(RTLIL::SigSpec sig)
Definition: sigtools.h:41
void log(const char *format,...)
Definition: log.cc:180
RTLIL::Module * module
Definition: sat.cc:42
static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str)
Definition: rtlil.cc:3078
std::vector< std::pair< std::string, std::string > > prove_x
Definition: sat.cc:50
RTLIL::Design * design
Definition: sat.cc:41
std::vector< std::pair< std::string, std::string > > prove
Definition: sat.cc:50
int signals_eq(RTLIL::SigSpec lhs, RTLIL::SigSpec rhs, int timestep_lhs=-1, int timestep_rhs=-1)
Definition: satgen.h:134
void check_undef_enabled(const RTLIL::SigSpec &sig)
Definition: sat.cc:81

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

bool SatHelper::solve ( const std::vector< int > &  assumptions)
inline

Definition at line 425 of file sat.cc.

426  {
427  log_assert(gotTimeout == false);
428  ez.setSolverTimeout(timeout);
429  bool success = ez.solve(modelExpressions, modelValues, assumptions);
430  if (ez.getSolverTimoutStatus())
431  gotTimeout = true;
432  return success;
433  }
bool gotTimeout
Definition: sat.cc:65
std::vector< bool > modelValues
Definition: sat.cc:462
std::vector< int > modelExpressions
Definition: sat.cc:461
#define log_assert(_assert_expr_)
Definition: log.h:85
ezDefaultSAT ez
Definition: sat.cc:44
int timeout
Definition: sat.cc:64

+ Here is the caller graph for this function:

bool SatHelper::solve ( int  a = 0,
int  b = 0,
int  c = 0,
int  d = 0,
int  e = 0,
int  f = 0 
)
inline

Definition at line 435 of file sat.cc.

436  {
437  log_assert(gotTimeout == false);
438  ez.setSolverTimeout(timeout);
439  bool success = ez.solve(modelExpressions, modelValues, a, b, c, d, e, f);
440  if (ez.getSolverTimoutStatus())
441  gotTimeout = true;
442  return success;
443  }
bool gotTimeout
Definition: sat.cc:65
std::vector< bool > modelValues
Definition: sat.cc:462
std::vector< int > modelExpressions
Definition: sat.cc:461
#define log_assert(_assert_expr_)
Definition: log.h:85
ezDefaultSAT ez
Definition: sat.cc:44
int timeout
Definition: sat.cc:64

Field Documentation

CellTypes SatHelper::ct

Definition at line 46 of file sat.cc.

RTLIL::Design* SatHelper::design

Definition at line 41 of file sat.cc.

bool SatHelper::enable_undef

Definition at line 56 of file sat.cc.

ezDefaultSAT SatHelper::ez

Definition at line 44 of file sat.cc.

bool SatHelper::gotTimeout

Definition at line 65 of file sat.cc.

bool SatHelper::ignore_unknown_cells

Definition at line 56 of file sat.cc.

int SatHelper::max_timestep

Definition at line 64 of file sat.cc.

std::vector<int> SatHelper::modelExpressions

Definition at line 461 of file sat.cc.

std::set<ModelBlockInfo> SatHelper::modelInfo

Definition at line 463 of file sat.cc.

std::vector<bool> SatHelper::modelValues

Definition at line 462 of file sat.cc.

RTLIL::Module* SatHelper::module

Definition at line 42 of file sat.cc.

std::vector<std::pair<std::string, std::string> > SatHelper::prove

Definition at line 50 of file sat.cc.

bool SatHelper::prove_asserts

Definition at line 53 of file sat.cc.

std::vector<std::pair<std::string, std::string> > SatHelper::prove_x

Definition at line 50 of file sat.cc.

SatGen SatHelper::satgen

Definition at line 47 of file sat.cc.

bool SatHelper::set_init_def

Definition at line 56 of file sat.cc.

bool SatHelper::set_init_undef

Definition at line 56 of file sat.cc.

bool SatHelper::set_init_zero

Definition at line 56 of file sat.cc.

std::vector<std::pair<std::string, std::string> > SatHelper::sets

Definition at line 50 of file sat.cc.

std::vector<std::string> SatHelper::sets_all_undef

Definition at line 57 of file sat.cc.

std::map<int, std::vector<std::string> > SatHelper::sets_all_undef_at

Definition at line 58 of file sat.cc.

std::vector<std::string> SatHelper::sets_any_undef

Definition at line 57 of file sat.cc.

std::map<int, std::vector<std::string> > SatHelper::sets_any_undef_at

Definition at line 58 of file sat.cc.

std::map<int, std::vector<std::pair<std::string, std::string> > > SatHelper::sets_at

Definition at line 51 of file sat.cc.

std::vector<std::string> SatHelper::sets_def

Definition at line 57 of file sat.cc.

std::map<int, std::vector<std::string> > SatHelper::sets_def_at

Definition at line 58 of file sat.cc.

std::vector<std::pair<std::string, std::string> > SatHelper::sets_init

Definition at line 50 of file sat.cc.

SigSet<RTLIL::Cell*> SatHelper::show_drivers

Definition at line 63 of file sat.cc.

SigPool SatHelper::show_signal_pool

Definition at line 62 of file sat.cc.

std::vector<std::string> SatHelper::shows

Definition at line 61 of file sat.cc.

SigMap SatHelper::sigmap

Definition at line 45 of file sat.cc.

int SatHelper::timeout

Definition at line 64 of file sat.cc.

std::map<int, std::vector<std::string> > SatHelper::unsets_at

Definition at line 52 of file sat.cc.


The documentation for this struct was generated from the following file: