SNL CPP API examples

#include <iostream>

#include "SNLUniverse.h"
#include "SNLScalarTerm.h"
#include "SNLBusTerm.h"
#include "SNLBusTermBit.h"
#include "SNLScalarNet.h"
#include "SNLInstTerm.h"

using namespace naja::SNL;

int main() {
  SNLUniverse::create();
  auto db = SNLDB::create(SNLUniverse::get());
  auto primLib = SNLLibrary::create(db, SNLLibrary::Type::Primitives, SNLName("primitives"));
  auto prim0 = SNLDesign::create(primLib, SNLDesign::Type::Primitive);
  auto prim1 = SNLDesign::create(primLib, SNLDesign::Type::Primitive);

  auto mylib = SNLLibrary::create(db, SNLName("mylib"));

  auto model1 = SNLDesign::create(mylib, SNLName("Model1"));
  {
    SNLScalarTerm::create(model1, SNLTerm::Direction::Input, SNLName("i0"));
    SNLScalarTerm::create(model1, SNLTerm::Direction::Input, SNLName("i1"));
    SNLScalarTerm::create(model1, SNLTerm::Direction::Output, SNLName("o"));
    SNLParameter::create(model1, SNLName("PARAM0"), SNLParameter::Type::Decimal, "18");
    SNLParameter::create(model1, SNLName("PARAM1"), SNLParameter::Type::String,  "OPTION2");
    SNLInstance::create(model1, prim0); // anonymous
    SNLInstance::create(model1, prim1, SNLName("ins"));
  }

  std::cout << model1->getName().getString() << " terms:" << std::endl;
  for (auto term: model1->getTerms()) {
    std::cout << "  - " << term->getString() << std::endl;
  }

  auto model2 = SNLDesign::create(mylib, SNLName("Model2"));
  SNLBusTerm::create(model2, SNLTerm::Direction::Input, 4, 0, SNLName("i0"));
  SNLScalarTerm::create(model2, SNLTerm::Direction::Input, SNLName("i1"));
  SNLBusTerm::create(model2, SNLTerm::Direction::Output, 31, 0, SNLName("o"));
  std::cout << model2->getName().getString() << " terms:" << std::endl;
  for (auto term: model2->getTerms()) {
    std::cout << "  - " << term->getString() << std::endl;
  }

  auto top = SNLDesign::create(mylib, SNLName("top"));
  {
    auto i = SNLScalarTerm::create(top, SNLTerm::Direction::Input, SNLName("i"));
    auto o = SNLScalarTerm::create(top, SNLTerm::Direction::Input, SNLName("o"));
    auto ins1 = SNLInstance::create(top, model1, SNLName("ins1"));
    auto ins2 = SNLInstance::create(top, model2, SNLName("ins2"));
    auto net1 = SNLScalarNet::create(top); //anonymous
    auto net2 = SNLScalarNet::create(top); //anonymous
    auto net3 = SNLScalarNet::create(top, SNLName("n"));
    i->setNet(net1);
    ins1->getInstTerm(ins1->getModel()->getScalarTerm(SNLName("i0")))->setNet(net1);
    ins1->getInstTerm(ins1->getModel()->getScalarTerm(SNLName("i1")))->setNet(net3);
    ins2->getInstTerm(ins2->getModel()->getScalarTerm(SNLName("i1")))->setNet(net3);
    ins2->getInstTerm(ins2->getModel()->getBusTerm(SNLName("o"))->getBit(0))->setNet(net3);
    o->setNet(net2);
  }

  auto topIns1 = top->getInstance(SNLName("ins1"));
  std::cout << topIns1->getName().getString() << " instance terminals:" << std::endl;
  for (auto instTerm: topIns1->getInstTerms()) {
    std::cout << "  - " << instTerm->getTerm()->getName().getString() << std::endl;
  }

  auto topNet1 = top->getScalarNet(0); // net1 is an anonymous net at ID 0
  std::cout << topNet1->getString() << " components:" << std::endl;
  for (auto component: topNet1->getComponents()) {
    std::cout << "  - " << component->getString() << std::endl;
  }

  return 0;
}