Fabrication Defects
A collection of tools to model defects that can occur during the fabrication process of FCN technologies.
SiDB Defect Types
Header: fiction/technology/sidb_defects.hpp
-
enum class fiction::sidb_defect_type : uint8_t
Specifies the types of fabrication defects that can occur on the H-Si(100) 2x1 surface according to “Atomic defect classification of the H–Si(100) surface through multi-mode scanning probe microscopy” by Jeremiah Croshaw, Thomas Dienel, Taleana Huff, and Robert Wolkow in Journal of Nanotechnology in 2020.
Values:
-
enumerator NONE
Defect-free H-Si.
-
enumerator DB
A stray dangling bond.
-
enumerator SI_VACANCY
A missing silicon atom.
-
enumerator SINGLE_DIHYDRIDE
Double hydrogen passivation.
-
enumerator DIHYDRIDE_PAIR
A missing bond between dimers that leads to two double hydrogen passivations.
-
enumerator ONE_BY_ONE
A collection of dihydride pairs.
-
enumerator THREE_BY_ONE
A collection of 1 by 1’s.
-
enumerator SILOXANE
An oxidized dimer.
-
enumerator RAISED_SI
A raised silicon dimer.
-
enumerator MISSING_DIMER
The dimer is missing altogether.
-
enumerator ETCH_PIT
A collection of missing dimers.
-
enumerator STEP_EDGE
A step edge, which is a break in the surface reconstruction.
-
enumerator GUNK
Residual material.
-
enumerator UNKNOWN
Unknown defect.
-
enumerator NONE
-
struct sidb_defect
In accordance with the paper mentioned above, the
sidb_defect
struct is used to represent a specific defect on the H-Si(100) 2x1 surface that has a charge as well as relative permittivity (epsilon_r
) and Thomas-Fermi screening distance (lambda_tf
) values associated to it.See “SiQAD: A Design and Simulation Tool for Atomic Silicon Quantum Dot Circuits” by S. S. H. Ng, J. Retallick, H. N. Chiu, R. Lupoiu, L. Livadaru, T. Huff, M. Rashidi, W. Vine, T. Dienel, R. A. Wolkow, and K. Walus in IEEE Transactions on Nanotechnology for more details on these values.
Public Functions
-
inline explicit constexpr sidb_defect(const sidb_defect_type defect_type = sidb_defect_type::UNKNOWN, const int64_t electric_charge = 0.0, const double relative_permittivity = 0.0, const double screening_distance = 0.0) noexcept
Standard constructor.
-
inline constexpr bool operator==(const sidb_defect &rhs) const noexcept
This operator compares two
sidb_defect
instances for equality. It checks if thetype
,charge
,epsilon_r
, andlambda_tf
members of the two instances are equal.- Parameters:
rhs –
sidb_defect
instance to compare against.
-
inline constexpr bool operator!=(const sidb_defect &rhs) const noexcept
This operator compares two
sidb_defect
instances for inequality. It uses theoperator==
to check if the two instances are equal and returns the negation of the result.- Parameters:
rhs –
sidb_defect
instance to compare against.
Public Members
-
sidb_defect_type type
Type of defect.
-
int64_t charge
Electrical charge in units of the elementary charge e (e.g., 1 ^= 1*e, -2 ^= -2*e).
-
double epsilon_r
Electric permittivity (unitless).
-
double lambda_tf
Thomas-Fermi screening distance in nm.
-
inline explicit constexpr sidb_defect(const sidb_defect_type defect_type = sidb_defect_type::UNKNOWN, const int64_t electric_charge = 0.0, const double relative_permittivity = 0.0, const double screening_distance = 0.0) noexcept
-
static constexpr bool fiction::is_charged_defect_type(const sidb_defect &defect) noexcept
Checks whether the given defect type is a charged one.
DB
andSI_VACANCY
types are charged. Those charged defects are to be avoided by a larger distance.- Parameters:
defect – Defect to check.
- Returns:
true
iffdefect
is of a charged type.
-
static constexpr bool fiction::is_neutral_defect_type(const sidb_defect &defect) noexcept
Checks whether the given defect type is not a charged one. Neutral defects are to be avoided as well, but not by such a large distance. Even though the
NONE
defect type is technically neutral, it is not a defect per se which is why this function returns false on theNONE
defect input.- Parameters:
defect – Defect to check.
- Returns:
true
iffdefect
is not of a charged type.
-
static constexpr bool fiction::is_positively_charged_defect(const sidb_defect &defect) noexcept
Checks whether the given defect has a positive charge value assigned to it. This function is irrespective of the associated defect type.
- Parameters:
defect – Defect to check.
- Returns:
true
iffdefect
has a positive charge value.
-
static constexpr bool fiction::is_negatively_charged_defect(const sidb_defect &defect) noexcept
Checks whether the given defect has a negative charge value assigned to it. This function is irrespective of the associated defect type.
- Parameters:
defect – Defect to check.
- Returns:
true
iffdefect
has a negative charge value.
-
static constexpr bool fiction::is_neutrally_charged_defect(const sidb_defect &defect) noexcept
Checks whether the given defect has a neutral charge value, i.e.,
0
, assigned to it. This function is irrespective of the associated defect type.- Parameters:
defect – Defect to check.
- Returns:
true
iffdefect
has a neutral charge value.
-
constexpr const uint16_t fiction::SIDB_CHARGED_DEFECT_HORIZONTAL_SPACING = 26u
Horizontal distance to keep from charged SiDB defects. The value is to be understood as the number of DB positions rather than the number of dimers. This is true even though each defect always affects the entire dimer.
-
constexpr const uint16_t fiction::SIDB_CHARGED_DEFECT_VERTICAL_SPACING = 13u
Vertical distance to keep from charged SiDB defects. The value is to be understood as the number of DB positions rather than the number of dimers. This is true even though each defect always affects the entire dimer.
-
constexpr const uint16_t fiction::SIDB_NEUTRAL_DEFECT_HORIZONTAL_SPACING = 1u
Horizontal distance to keep from neutral SiDB defects. The value is to be understood as the number of DB positions rather than the number of dimers. This is true even though each defect always affects the entire dimer.
-
constexpr const uint16_t fiction::SIDB_NEUTRAL_DEFECT_VERTICAL_SPACING = 0u
Vertical distance to keep from neutral SiDB defects. The value is to be understood as the number of DB positions rather than the number of dimers. This is true even though each defect always affects the entire dimer.
-
static constexpr std::pair<uint16_t, uint16_t> fiction::defect_extent(const sidb_defect &defect, const std::optional<std::pair<uint16_t, uint16_t>> &charged_defect_spacing_overwrite = std::nullopt, const std::optional<std::pair<uint16_t, uint16_t>> &neutral_defect_spacing_overwrite = std::nullopt) noexcept
Returns the extent of a defect as a pair of SiDB distances in the horizontal and vertical directions. If the defect type is
NONE
,{0, 0}
is returned.- Parameters:
defect – Defect type to evaluate.
charged_defect_spacing_overwrite – Override the default influence distance of charged atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
neutral_defect_spacing_overwrite – Override the default influence distance of neutral atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
- Returns:
A pair of uint16_t values representing the number of horizontal and vertical SiDBs affected by the given defect type.
- class mnt.pyfiction.sidb_defect_type
Specifies the types of fabrication defects that can occur on the H-Si(100) 2x1 surface according to "Atomic defect classification of the H–Si(100) surface through multi-mode scanning probe microscopy" by Jeremiah Croshaw, Thomas Dienel, Taleana Huff, and Robert Wolkow in Journal of Nanotechnology in 2020.
Members:
NONE : Defect-free H-Si.
DB : A stray dangling bond.
SI_VACANCY : A missing silicon atom.
SINGLE_DIHYDRIDE : Double hydrogen passivation.
DIHYDRIDE_PAIR : A missing bond between dimers that leads to two double hydrogen
passivations.
ONE_BY_ONE : A collection of dihydride pairs.
THREE_BY_ONE : A collection of 1 by 1’s.
SILOXANE : An oxidized dimer.
RAISED_SI : A raised silicon dimer.
MISSING_DIMER : The dimer is missing altogether.
ETCH_PIT : A collection of missing dimers.
STEP_EDGE : A step edge, which is a break in the surface reconstruction.
GUNK : Residual material.
UNKNOWN : Unknown defect.
- property name
- class mnt.pyfiction.sidb_defect
In accordance with the paper mentioned above, the sidb_defect struct is used to represent a specific defect on the H-Si(100) 2x1 surface that has a charge as well as relative permittivity (epsilon_r) and Thomas-Fermi screening distance (lambda_tf) values associated to it.
See "SiQAD: A Design and Simulation Tool for Atomic Silicon Quantum Dot Circuits" by S. S. H. Ng, J. Retallick, H. N. Chiu, R. Lupoiu, L. Livadaru, T. Huff, M. Rashidi, W. Vine, T. Dienel, R. A. Wolkow, and K. Walus in IEEE Transactions on Nanotechnology for more details on these values.
- property charge
Electrical charge in units of the elementary charge e (e.g., 1 ^= 1*e, -2 ^= -2*e).
- property epsilon_r
Electric permittivity (unitless).
- property lambda_tf
Thomas-Fermi screening distance in nm.
- property type
Specifies the types of fabrication defects that can occur on the H-Si(100) 2x1 surface according to "Atomic defect classification of the H–Si(100) surface through multi-mode scanning probe microscopy" by Jeremiah Croshaw, Thomas Dienel, Taleana Huff, and Robert Wolkow in Journal of Nanotechnology in 2020.
- mnt.pyfiction.is_charged_defect_type(defect: mnt.pyfiction.pyfiction.sidb_defect) bool
Checks whether the given defect type is a charged one. DB and SI_VACANCY types are charged. Those charged defects are to be avoided by a larger distance.
- Parameter
defect
: Defect to check.
- Returns:
true iff defect is of a charged type.
- Parameter
- mnt.pyfiction.is_neutral_defect_type(defect: mnt.pyfiction.pyfiction.sidb_defect) bool
Checks whether the given defect type is not a charged one. Neutral defects are to be avoided as well, but not by such a large distance. Even though the NONE defect type is technically neutral, it is not a defect per se which is why this function returns false on the NONE defect input.
- Parameter
defect
: Defect to check.
- Returns:
true iff defect is not of a charged type.
- Parameter
- mnt.pyfiction.is_positively_charged_defect(defect: mnt.pyfiction.pyfiction.sidb_defect) bool
Checks whether the given defect has a positive charge value assigned to it. This function is irrespective of the associated defect type.
- Parameter
defect
: Defect to check.
- Returns:
true iff defect has a positive charge value.
- Parameter
- mnt.pyfiction.is_negatively_charged_defect(defect: mnt.pyfiction.pyfiction.sidb_defect) bool
Checks whether the given defect has a negative charge value assigned to it. This function is irrespective of the associated defect type.
- Parameter
defect
: Defect to check.
- Returns:
true iff defect has a negative charge value.
- Parameter
- mnt.pyfiction.is_neutrally_charged_defect(defect: mnt.pyfiction.pyfiction.sidb_defect) bool
Checks whether the given defect has a neutral charge value, i.e., 0, assigned to it. This function is irrespective of the associated defect type.
- Parameter
defect
: Defect to check.
- Returns:
true iff defect has a neutral charge value.
- Parameter
- mnt.pyfiction.defect_extent(defect: mnt.pyfiction.pyfiction.sidb_defect, charged_defect_spacing_overwrite: tuple[SupportsInt, SupportsInt] | None, neutral_defect_spacing_overwrite: tuple[SupportsInt, SupportsInt] | None) tuple[int, int]
Returns the extent of a defect as a pair of SiDB distances in the horizontal and vertical directions. If the defect type is NONE, {0, 0} is returned.
- Parameter
defect
: Defect type to evaluate.
- Parameter
charged_defect_spacing_overwrite
: Override the default influence distance of charged atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
- Parameter
neutral_defect_spacing_overwrite
: Override the default influence distance of neutral atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
- Returns:
A pair of uint16_t values representing the number of horizontal and vertical SiDBs affected by the given defect type.
- Parameter
SiDB Defect Surface
Header: fiction/technology/sidb_defect_surface.hpp
A layout type to layer on top of any SiDB cell-level layout. It implements an interface to store and access fabrication defects on the H-Si(100) 2x1 surface.
-
template<typename Lyt, bool has_sidb_defect_surface = std::conjunction_v<has_assign_sidb_defect<Lyt>, has_get_sidb_defect<Lyt>>>
class sidb_defect_surface : public Lyt A layout type to layer on top of any SiDB cell-level layout. It implements an interface to store and access fabrication defects on the H-Si(100) 2x1 surface.
- Template Parameters:
Lyt – SiDB cell-level layout type.
has_sidb_defect_surface – Automatically determines whether a defect interface is already present.
-
template<typename Lyt>
class sidb_defect_surface<Lyt, false> : public Lyt Public Functions
-
inline explicit sidb_defect_surface(const sidb_defect_surface_params &ps = {})
Standard constructor for empty layouts.
- Parameters:
ps – SiDB defect surface parameters.
-
inline explicit sidb_defect_surface(const typename Lyt::aspect_ratio &ar, const sidb_defect_surface_params &ps = {})
Standard constructor that layers the SiDB defect interface onto a layout with aspect ratio ar as input.
- Parameters:
ar – aspect ratio of the layout.
ps – SiDB defect surface parameters.
-
inline explicit sidb_defect_surface(const Lyt &lyt, const sidb_defect_surface_params &ps = {})
Standard constructor that layers the SiDB defect interface onto an existing layout.
- Parameters:
lyt – Existing layout that is to be extended by an SiDB defect interface.
ps – SiDB defect surface parameters.
-
inline sidb_defect_surface clone() const noexcept
Clones the layout returning a deep copy.
- Returns:
Deep copy of the layout.
-
inline void assign_sidb_defect(const typename Lyt::coordinate &c, const sidb_defect &d) noexcept
Assigns a given defect type to the given coordinate.
- Parameters:
c – Coordinate to assign defect d to.
d – Defect to assign to coordinate c.
-
inline void move_sidb_defect(const typename Lyt::coordinate &source, const typename Lyt::coordinate &target) noexcept
Moves an SiDB defect from one cell to another.
- Parameters:
source – Source coordinate of the defect.
target – Target coordinate to move the defect to.
-
inline sidb_defect get_sidb_defect(const typename Lyt::coordinate &c) const noexcept
Returns the given coordinate’s assigned defect type. If no defect type has been assigned, NONE is returned.
- Parameters:
c – Coordinate to check.
- Returns:
Defect type previously assigned to c or NONE if no defect was yet assigned.
-
inline uint64_t num_defects() const noexcept
Returns the number of defective coordinates on the surface.
- Returns:
Number of defective coordinates.
-
inline std::size_t num_positively_charged_defects() const noexcept
Number of positively charged defects on the surface.
- Returns:
Number of positively charged defects.
-
inline std::size_t num_negatively_charged_defects() const noexcept
Returns the number of negatively charged defects.
- Returns:
Number of negatively charged defects.
-
inline std::size_t num_charged_defects() const noexcept
Returns the number of charged defects.
- Returns:
Number of charged defects.
-
inline std::size_t num_neutral_defects() const noexcept
Returns the number of neutral defects.
- Returns:
Number of neutral defects.
-
template<typename Fn>
inline void foreach_sidb_defect(Fn &&fn) const Applies a function to all defects on the surface. Since the defects are fetched directly from the storage map, the given function has to receive a pair of a coordinate and a defect type as its parameter.
- Template Parameters:
Fn – Functor type that has to comply with the restrictions imposed by mockturtle::foreach_element.
- Parameters:
fn – Functor to apply to each defect.
-
inline std::unordered_set<typename Lyt::coordinate> affected_sidbs(const typename Lyt::coordinate &c, const std::optional<std::pair<uint16_t, uint16_t>> &charged_defect_spacing_overwrite = std::nullopt, const std::optional<std::pair<uint16_t, uint16_t>> &neutral_defect_spacing_overwrite = std::nullopt) const noexcept
Returns all SiDB positions affected by the defect at the given coordinate. This function relies on the defect_extent function defined in sidb_defects.hpp that computes the extent of charged and neutral defect types.
If the given coordinate is defect-free, the empty set is returned.
- Parameters:
c – Coordinate whose defect extent is to be determined.
charged_defect_spacing_overwrite – Override the default influence distance of charged atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
neutral_defect_spacing_overwrite – Override the default influence distance of neutral atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
- Returns:
All SiDB positions affected by the defect at coordinate c.
-
inline std::unordered_set<typename Lyt::coordinate> all_affected_sidbs(const std::optional<std::pair<uint64_t, uint64_t>> &charged_defect_spacing_overwrite = std::nullopt, const std::optional<std::pair<uint64_t, uint64_t>> &neutral_defect_spacing_overwrite = std::nullopt) const noexcept
Returns all SiDB positions affected by any defect on the surface. This function relies on the defect_extent function defined in sidb_defects.hpp that computes the extent of charged and neutral defect types.
If the given surface is defect-free, the empty set is returned.
- Parameters:
charged_defect_spacing_overwrite – Override the default influence distance of charged atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
neutral_defect_spacing_overwrite – Override the default influence distance of neutral atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
- Returns:
All SiDB positions affected by any defect on the surface.
-
template<>
struct sidb_surface_storage
-
inline explicit sidb_defect_surface(const sidb_defect_surface_params &ps = {})
SiDB Defect Analysis
Header: fiction/technology/sidb_surface_analysis.hpp
-
template<typename GateLibrary, typename GateLyt, typename CellLyt>
auto fiction::sidb_surface_analysis(const GateLyt &gate_lyt, const CellLyt &surface, const std::optional<std::pair<uint64_t, uint64_t>> &charged_defect_spacing_overwrite = std::nullopt, const std::optional<std::pair<uint64_t, uint64_t>> &neutral_defect_spacing_overwrite = std::nullopt) noexcept Analyzes a given defective SiDB surface and matches it against gate tiles provided by a library. Any gate type that cannot be realized on a certain tile due to disturbances caused by defects gets blacklisted on said tile. The black list is then returned by this function.
Note
The given gate library must implement both the
get_functional_implementations()
andget_gate_ports()
functions.- Template Parameters:
GateLibrary – FCN gate library type to fetch the gate descriptions from.
GateLyt – Gate-level layout type that specifies the tiling of the SiDB surface.
CellLyt – SiDB cell-level layout type that is underlying to the SiDB defect surface.
- Parameters:
gate_lyt – Gate-level layout instance that specifies the aspect ratio.
surface – SiDB surface that instantiates the defects.
charged_defect_spacing_overwrite – Override the default influence distance of charged atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
neutral_defect_spacing_overwrite – Override the default influence distance of neutral atomic defects on SiDBs with an optional pair of horizontal and vertical distances.
- Returns:
A black list of gate functions associated with tiles.