Logic Simulation ExampleΒΆ

Sweep relative permittivity at two points and write the classified domain as CSV. This layout produces two NON_OPERATIONAL entries: a completed sweep does not imply that the layout implements the identity function.

#include <fiction/technology/sidb/layout.hpp>
#include <fiction/technology/sidb/simulation/logic/operational_domain.hpp>
#include <fiction/technology/sidb/simulation/io/write_operational_domain.hpp>
#include <fiction/synthesis/truth_tables.hpp>
#include <cassert>
#include <initializer_list>
#include <iostream>

int main()
{
    namespace sidb = fiction::sidb;
    namespace logic = sidb::simulation::logic;
    sidb::layout wire{};
    const auto place = [&](sidb::dot_tag tag, std::initializer_list<int> xs)
    {
        for (const auto x : xs) { wire.assign_sidb({x, 0, 0}, tag); }
    };
    place(sidb::dot_tag::INPUT, {0, 2});
    place(sidb::dot_tag::NORMAL, {6, 8, 18});
    place(sidb::dot_tag::OUTPUT, {12, 14});
    logic::operational_domain_params params{};
    params.operational_params.sim_params.base = 2;
    params.operational_params.timeout = 5'000;
    params.sweep_dimensions = {{logic::sweep_parameter::EPSILON_R, 5.5, 5.6, 0.1}};
    const auto domain = logic::operational_domain_grid_search(wire, {fiction::synthesis::create_id_tt()}, params);
    assert(domain.size() == 2);
    sidb::simulation::io::write_operational_domain(domain, std::cout);
}
from mnt.pyfiction.sidb import lattice_site, sidb_dot_tag, sidb_layout
from mnt.pyfiction.sidb.simulation.io import write_operational_domain_to_string
from mnt.pyfiction.sidb.simulation.logic import (
    operational_domain_grid_search,
    operational_domain_value_range,
    sweep_parameter,
)
from mnt.pyfiction.synthesis import create_id_tt

wire = sidb_layout()
for tag, xs in (
    (sidb_dot_tag.INPUT, (0, 2)),
    (sidb_dot_tag.NORMAL, (6, 8, 18)),
    (sidb_dot_tag.OUTPUT, (12, 14)),
):
    for x in xs:
        wire.assign_sidb(lattice_site(x, 0, 0), tag)
axis = operational_domain_value_range(sweep_parameter.EPSILON_R, 5.5, 5.6, 0.1)
domain = operational_domain_grid_search(wire, [create_id_tt()], base=2, sweep_dimensions=[axis], timeout=5_000)
assert len(domain) == 2
print(write_operational_domain_to_string(domain))