Skip to content

Commit 735daab

Browse files
Drewniokactions-userpre-commit-ci[bot]
authored
✨ Restructured Critical Temperature simulation with kink control option (#573)
* ✨ support kink setting in critical temperature simulation. * 📝 Update pyfiction docstrings Signed-off-by: GitHub Actions <[email protected]> * 🎨 Incorporated pre-commit fixes * 🎨 small fix. * 🎨 small fix. * 🎨 small fix. * 🎨 Incorporated pre-commit fixes * 📝 Update pyfiction docstrings Signed-off-by: GitHub Actions <[email protected]> * 🎨 integrate Marcel's feedback. * 📝 Update pyfiction docstrings Signed-off-by: GitHub Actions <[email protected]> * 📝 update docu. * 🎨 Incorporated pre-commit fixes * 🎨 implement Marcel's feedback. * 🎨 Incorporated pre-commit fixes * 📝 Update pyfiction docstrings Signed-off-by: GitHub Actions <[email protected]> * 🎨 small fix. --------- Signed-off-by: GitHub Actions <[email protected]> Co-authored-by: GitHub Actions <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent e5be31c commit 735daab

File tree

17 files changed

+782
-300
lines changed

17 files changed

+782
-300
lines changed

bindings/pyfiction/include/pyfiction/algorithms/simulation/sidb/calculate_energy_and_state_type.hpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,15 @@ void calculate_energy_and_state_type(pybind11::module& m)
2626
{
2727
using namespace pybind11::literals;
2828

29-
m.def("calculate_energy_and_state_type", &fiction::calculate_energy_and_state_type<Lyt, py_tt>,
30-
"energy_distribution"_a, "valid_charge_distributions"_a, "output_bdl_pairs"_a, "spec"_a, "input_index"_a,
31-
DOC(fiction_calculate_energy_and_state_type));
29+
m.def("calculate_energy_and_state_type_with_kinks_accepted",
30+
&fiction::calculate_energy_and_state_type_with_kinks_accepted<Lyt, py_tt>, "energy_distribution"_a,
31+
"valid_charge_distributions"_a, "output_bdl_pairs"_a, "spec"_a, "input_index"_a,
32+
DOC(fiction_calculate_energy_and_state_type_with_kinks_accepted));
33+
34+
m.def("calculate_energy_and_state_type_with_kinks_rejected",
35+
&fiction::calculate_energy_and_state_type_with_kinks_rejected<Lyt, py_tt>, "energy_distribution"_a,
36+
"valid_charge_distributions"_a, "spec"_a, "input_index"_a, "input_bdl_wires"_a, "output_bdl_wires"_a,
37+
DOC(fiction_calculate_energy_and_state_type_with_kinks_rejected));
3238
}
3339

3440
} // namespace detail

bindings/pyfiction/include/pyfiction/algorithms/simulation/sidb/critical_temperature.hpp

+2-16
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,6 @@ inline void critical_temperature(pybind11::module& m)
4141
{
4242
namespace py = pybind11;
4343

44-
/**
45-
* Simulation engine.
46-
*/
47-
py::enum_<fiction::critical_temperature_params::simulation_engine>(
48-
m, "simulation_engine", DOC(fiction_critical_temperature_params_simulation_engine))
49-
.value("EXACT", fiction::critical_temperature_params::simulation_engine::EXACT,
50-
DOC(fiction_critical_temperature_params_simulation_engine_EXACT))
51-
.value("APPROXIMATE", fiction::critical_temperature_params::simulation_engine::APPROXIMATE,
52-
DOC(fiction_critical_temperature_params_simulation_engine_APPROXIMATE));
53-
5444
/**
5545
* Critical temperature statistics.
5646
*/
@@ -81,16 +71,12 @@ inline void critical_temperature(pybind11::module& m)
8171
py::class_<fiction::critical_temperature_params>(m, "critical_temperature_params",
8272
DOC(fiction_critical_temperature_params))
8373
.def(py::init<>())
84-
.def_readwrite("simulation_parameters", &fiction::critical_temperature_params::simulation_parameters,
74+
.def_readwrite("operational_params", &fiction::critical_temperature_params::operational_params,
8575
DOC(fiction_critical_temperature_params))
86-
.def_readwrite("engine", &fiction::critical_temperature_params::engine,
87-
DOC(fiction_critical_temperature_params_engine))
8876
.def_readwrite("confidence_level", &fiction::critical_temperature_params::confidence_level,
8977
DOC(fiction_critical_temperature_params_confidence_level))
9078
.def_readwrite("max_temperature", &fiction::critical_temperature_params::max_temperature,
91-
DOC(fiction_critical_temperature_params_max_temperature))
92-
.def_readwrite("input_iterator_params", &fiction::critical_temperature_params::input_iterator_params,
93-
DOC(fiction_critical_temperature_params_input_iterator_params));
79+
DOC(fiction_critical_temperature_params_max_temperature));
9480

9581
// NOTE be careful with the order of the following calls! Python will resolve the first matching overload!
9682

bindings/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp

+116-30
Original file line numberDiff line numberDiff line change
@@ -1122,10 +1122,11 @@ static const char *__doc_fiction_bounding_box_2d_x_size = R"doc(The horizontal s
11221122

11231123
static const char *__doc_fiction_bounding_box_2d_y_size = R"doc(The vertical size of the bounding box in layout coordinates.)doc";
11241124

1125-
static const char *__doc_fiction_calculate_energy_and_state_type =
1125+
static const char *__doc_fiction_calculate_energy_and_state_type_with_kinks_accepted =
11261126
R"doc(This function takes in an SiDB energy distribution. For each charge
11271127
distribution, the state type is determined (i.e. erroneous,
1128-
transparent).
1128+
transparent) while kinks are accepted, meaning a state with kinks is
1129+
considered transparent.
11291130

11301131
Template parameter ``Lyt``:
11311132
SiDB cell-level layout type.
@@ -1153,6 +1154,44 @@ Parameter ``input_index``:
11531154
Electrostatic potential energy of all charge distributions with
11541155
state type.)doc";
11551156

1157+
static const char *__doc_fiction_calculate_energy_and_state_type_with_kinks_rejected =
1158+
R"doc(This function takes in an SiDB energy distribution. For each charge
1159+
distribution, the state type is determined (i.e. erroneous,
1160+
transparent) while kinks are rejected, meaning a state with kinks is
1161+
considered erroneous.
1162+
1163+
Template parameter ``Lyt``:
1164+
SiDB cell-level layout type.
1165+
1166+
Template parameter ``TT``:
1167+
The type of the truth table specifying the gate behavior.
1168+
1169+
Parameter ``energy_distribution``:
1170+
Energy distribution.
1171+
1172+
Parameter ``valid_charge_distributions``:
1173+
Physically valid charge distributions.
1174+
1175+
Parameter ``output_bdl_pairs``:
1176+
Output BDL pairs.
1177+
1178+
Parameter ``spec``:
1179+
Expected Boolean function of the layout given as a multi-output
1180+
truth table.
1181+
1182+
Parameter ``input_index``:
1183+
The index of the current input configuration.
1184+
1185+
Parameter ``input_bdl_wires``:
1186+
Input BDL wires.
1187+
1188+
Parameter ``output_bdl_wires``:
1189+
Output BDL wires.
1190+
1191+
Returns:
1192+
Electrostatic potential energy of all charge distributions with
1193+
state type.)doc";
1194+
11561195
static const char *__doc_fiction_can_positive_charges_occur =
11571196
R"doc(This algorithm determines if positively charged SiDBs can occur in a
11581197
given SiDB cell-level layout due to strong electrostatic interaction.
@@ -3428,10 +3467,6 @@ probability of less than the given percentage, is determined to be the
34283467
critical temperature. For gate-based simulation, this is the
34293468
probability of erroneous calculations of the gate.)doc";
34303469

3431-
static const char *__doc_fiction_critical_temperature_params_engine = R"doc(Simulation mode to determine the *Critical Temperature*.)doc";
3432-
3433-
static const char *__doc_fiction_critical_temperature_params_input_iterator_params = R"doc(Parameters for the BDL input iterator.)doc";
3434-
34353470
static const char *__doc_fiction_critical_temperature_params_iteration_steps =
34363471
R"doc(Number of iteration steps for the *QuickSim* algorithm (only
34373472
applicable if engine == APPROXIMATE).)doc";
@@ -3440,21 +3475,9 @@ static const char *__doc_fiction_critical_temperature_params_max_temperature =
34403475
R"doc(Maximum simulation temperature beyond which no simulation will be
34413476
conducted (~ 126 °C by default) (unit: K).)doc";
34423477

3443-
static const char *__doc_fiction_critical_temperature_params_simulation_engine =
3444-
R"doc(An enumeration of simulation modes (exact vs. approximate) to use for
3445-
the *Critical Temperature* Simulation.)doc";
3446-
3447-
static const char *__doc_fiction_critical_temperature_params_simulation_engine_APPROXIMATE =
3448-
R"doc(This simulation engine quickly calculates the *Critical Temperature*.
3449-
However, there may be deviations from the exact *Critical
3450-
Temperature*. This mode is recommended for larger layouts (> 40
3451-
SiDBs).)doc";
3452-
3453-
static const char *__doc_fiction_critical_temperature_params_simulation_engine_EXACT =
3454-
R"doc(This simulation engine computes *Critical Temperature* values with 100
3455-
% accuracy.)doc";
3456-
3457-
static const char *__doc_fiction_critical_temperature_params_simulation_parameters = R"doc(All parameters for physical SiDB simulations.)doc";
3478+
static const char *__doc_fiction_critical_temperature_params_operational_params =
3479+
R"doc(The parameters used to determine if a layout is `operational` or `non-
3480+
operational`.)doc";
34583481

34593482
static const char *__doc_fiction_critical_temperature_stats = R"doc(This struct stores the result of the temperature simulation.)doc";
34603483

@@ -4531,7 +4554,7 @@ given Boolean function.)doc";
45314554

45324555
static const char *__doc_fiction_detail_critical_temperature_impl_params = R"doc(Parameters for the critical_temperature algorithm.)doc";
45334556

4534-
static const char *__doc_fiction_detail_critical_temperature_impl_physical_simulation_of_layout =
4557+
static const char *__doc_fiction_detail_critical_temperature_impl_physical_simulation_of_bdl_iterator =
45354558
R"doc(This function conducts physical simulation of the given layout (gate
45364559
layout with certain input combination). The simulation results are
45374560
stored in the `sim_result_100` variable.
@@ -6844,21 +6867,18 @@ R"doc(Constructor to initialize the algorithm with a layout and parameters.
68446867
Parameter ``lyt``:
68456868
The SiDB cell-level layout to be checked.
68466869

6847-
Parameter ``spec``:
6870+
Parameter ``tt``:
68486871
Expected Boolean function of the layout given as a multi-output
68496872
truth table.
68506873

68516874
Parameter ``params``:
68526875
Parameters for the `is_operational` algorithm.
68536876

6854-
Parameter ``input_bdl_wire``:
6855-
Optional BDL input wires of lyt.
6856-
6857-
Parameter ``output_bdl_wire``:
6858-
Optional BDL output wires of lyt.
6877+
Parameter ``input_wires``:
6878+
BDL input wires of lyt.
68596879

6860-
Parameter ``input_bdl_wire_direction``:
6861-
Optional BDL input wire directions of lyt.)doc";
6880+
Parameter ``output_wires``:
6881+
BDL output wires of lyt.)doc";
68626882

68636883
static const char *__doc_fiction_detail_is_operational_impl_layout = R"doc(SiDB cell-level layout.)doc";
68646884

@@ -6895,6 +6915,28 @@ static const char *__doc_fiction_detail_is_operational_impl_simulator_invocation
68956915

68966916
static const char *__doc_fiction_detail_is_operational_impl_truth_table = R"doc(The specification of the layout.)doc";
68976917

6918+
static const char *__doc_fiction_detail_is_operational_impl_verifiy_logic_match_of_cds =
6919+
R"doc(Checks if the given charge distribution correctly encodes the expected
6920+
logic for the given input pattern, based on a provided truth table.
6921+
6922+
Example: In the ground state charge distribution of an AND gate, kinks
6923+
are rejected for the gate to be considered operational. Given an input
6924+
pattern of `01`, this function will: - Verify that the left input wire
6925+
encodes `0`. - Verify that the right input wire encodes `1`. - Verify
6926+
that the output wire encodes `0`. Determines if the given charge
6927+
distribution fulfills the correct logic based on the provided charge
6928+
index and truth table.
6929+
6930+
Parameter ``given_cds``:
6931+
The charge distribution surface to be checked for operation.
6932+
6933+
Parameter ``input_pattern``:
6934+
Input pattern represented by the position of perturbers.
6935+
6936+
Returns:
6937+
Operational status indicating if the layout is `operational` or
6938+
`non-operational`.)doc";
6939+
68986940
static const char *__doc_fiction_detail_jump_point_search_impl = R"doc()doc";
68996941

69006942
static const char *__doc_fiction_detail_jump_point_search_impl_closed_list = R"doc(Closed list that acts as a set of already visited coordinates.)doc";
@@ -18211,6 +18253,50 @@ Template parameter ``Lyt``:
1821118253
Returns:
1821218254
USE clocking scheme.)doc";
1821318255

18256+
static const char *__doc_fiction_verify_logic_match =
18257+
R"doc(Checks if a given charge distribution correctly encodes the expected
18258+
logic for a specified input pattern, based on a provided truth table.
18259+
18260+
@note Kinks are rejected.
18261+
18262+
Example: In the ground state charge distribution of an AND gate, kinks
18263+
are rejected for the gate to be considered operational. Given an input
18264+
pattern of `01`, this function will: - Verify that the left input wire
18265+
encodes `0`. - Verify that the right input wire encodes `1`. - Verify
18266+
that the output wire encodes `0`.
18267+
18268+
Template parameter ``Lyt``:
18269+
SiDB cell-level layout type.
18270+
18271+
Template parameter ``TT``:
18272+
Truth table type.
18273+
18274+
Parameter ``cds``:
18275+
Charge distribution surface, containing charge state information
18276+
for each SiDB.
18277+
18278+
Parameter ``params``:
18279+
The parameters used to determine if a layout is `operational` or
18280+
`non-operational`.
18281+
18282+
Parameter ``spec``:
18283+
Expected Boolean function of the layout given as a multi-output
18284+
truth table.
18285+
18286+
Parameter ``input_pattern``:
18287+
The specific input pattern of the given charge distribution
18288+
surface.
18289+
18290+
Parameter ``input_wires``:
18291+
Input BDL wires.
18292+
18293+
Parameter ``output_wires``:
18294+
Output BDL wires.
18295+
18296+
Returns:
18297+
The operational status indicating if the charge distribution
18298+
matches the logic for the given input pattern.)doc";
18299+
1821418300
static const char *__doc_fiction_vertex_coloring =
1821518301
R"doc(A vertex coloring is simply a hash map from vertex IDs to Color types
1821618302
where Color should be constructible/convertible from int.

bindings/pyfiction/test/algorithms/simulation/sidb/test_critical_temperature.py

+13-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ def test_perturber_and_DB_pair_100(self):
1515
layout.assign_cell_type((6, 1), sidb_technology.cell_type.NORMAL)
1616

1717
params = critical_temperature_params()
18-
params.engine = simulation_engine.EXACT
18+
19+
params.operational_params.sim_engine = sidb_simulation_engine.QUICKEXACT
1920

2021
stats = critical_temperature_stats()
2122

@@ -33,7 +34,8 @@ def test_perturber_and_DB_pair_111(self):
3334
layout.assign_cell_type((6, 1), sidb_technology.cell_type.NORMAL)
3435

3536
params = critical_temperature_params()
36-
params.engine = simulation_engine.EXACT
37+
38+
params.operational_params.sim_engine = sidb_simulation_engine.QUICKEXACT
3739

3840
stats = critical_temperature_stats()
3941

@@ -47,8 +49,10 @@ def test_perturber_and_DB_pair_111(self):
4749
def test_gate_based_simulation(self):
4850
layout = read_sqd_layout_100(dir_path + "/../../../resources/hex_21_inputsdbp_xor_v1.sqd", "xor_gate")
4951
params = critical_temperature_params()
50-
params.simulation_parameters.base = 2
51-
params.engine = simulation_engine.EXACT
52+
53+
params.operational_params.simulation_parameters.base = 2
54+
55+
params.operational_params.sim_engine = sidb_simulation_engine.QUICKEXACT
5256

5357
stats = critical_temperature_stats()
5458

@@ -64,7 +68,8 @@ def test_bestagon_inv(self):
6468
"inverter_input_0")
6569

6670
params = critical_temperature_params()
67-
params.engine = simulation_engine.APPROXIMATE
71+
72+
params.operational_params.sim_engine = sidb_simulation_engine.QUICKSIM
6873

6974
stats = critical_temperature_stats()
7075

@@ -81,10 +86,10 @@ def test_bestagon_inv_with_different_mu(self):
8186
"inverter_input_0")
8287

8388
params = critical_temperature_params()
84-
params.simulation_parameters.base = 2
85-
params.simulation_parameters.mu_minus = -0.2
89+
params.operational_params.simulation_parameters.base = 2
90+
params.operational_params.simulation_parameters.mu_minus = -0.2
8691

87-
params.engine = simulation_engine.EXACT
92+
params.operational_params.sim_engine = sidb_simulation_engine.QUICKEXACT
8893

8994
stats = critical_temperature_stats()
9095

cli/cmd/simulation/temp.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ class temp_command : public command
129129
}
130130
else
131131
{
132-
params.simulation_parameters = physical_params;
132+
params.operational_params.simulation_parameters = physical_params;
133133

134134
if (is_set("gate_based"))
135135
{

docs/algorithms/sidb_simulation.rst

+8-2
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ Temperature Behavior
149149
**Header:** ``fiction/algorithms/simulation/sidb/calculate_energy_and_state_type.hpp``
150150

151151
.. doxygentypedef:: fiction::sidb_energy_and_state_type
152-
.. doxygenfunction:: fiction::calculate_energy_and_state_type
152+
.. doxygenfunction:: fiction::calculate_energy_and_state_type_with_kinks_accepted
153+
.. doxygenfunction:: fiction::calculate_energy_and_state_type_with_kinks_rejected
153154

154155
.. tab:: Python
155156
.. autoclass:: mnt.pyfiction.simulation_engine
@@ -162,7 +163,8 @@ Temperature Behavior
162163
.. autofunction:: mnt.pyfiction.occupation_probability_gate_based
163164
.. autofunction:: mnt.pyfiction.occupation_probability_non_gate_based
164165

165-
.. autofunction:: mnt.pyfiction.calculate_energy_and_state_type
166+
.. autofunction:: mnt.pyfiction.calculate_energy_and_state_type_with_kinks_accepted
167+
.. autofunction:: mnt.pyfiction.calculate_energy_and_state_type_with_kinks_rejected
166168

167169

168170
Maximum Defect Influence Distance
@@ -259,6 +261,10 @@ Operational Domain Computation
259261
:members:
260262
.. doxygenfunction:: fiction::compute_operational_ratio
261263

264+
**Header:** ``fiction/algorithms/simulation/sidb/verify_logic_match.hpp``
265+
266+
.. doxygenfunction:: fiction::verify_logic_match
267+
262268
.. tab:: Python
263269
.. autoclass:: mnt.pyfiction.operational_status
264270
:members:

experiments/sidb_simulation/temperature/critical_temperature_simulation_siqad.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ int main() // NOLINT
4545
// Quantum Dot Circuits\" by Samuel Sze Hang Ng, Jacob Retallick, Hsi Nien Chiu, Robert Lupoiu, Lucian Livadaru,
4646
// Taleana Huff, Mohammad Rashidi, Wyatt Vine, Thomas Dienel, Robert A. Wolkow, and Konrad Walus in IEEE
4747
// TRANSACTIONS ON NANOTECHNOLOGY, Volume 19, 2020. (https://ieeexplore.ieee.org/abstract/document/8963859)
48-
ct_params.input_iterator_params.input_bdl_config =
48+
ct_params.operational_params.input_bdl_iterator_params.input_bdl_config =
4949
bdl_input_iterator_params::input_bdl_configuration::PERTURBER_ABSENCE_ENCODED;
5050

5151
for (const auto& [gate, truth_table] : gates)

0 commit comments

Comments
 (0)