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

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.

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 the type, charge, epsilon_r, and lambda_tf members of the two instances are equal.

Parameters:

rhssidb_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 the operator== to check if the two instances are equal and returns the negation of the result.

Parameters:

rhssidb_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.

static constexpr bool fiction::is_charged_defect_type(const sidb_defect &defect) noexcept

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.

Parameters:

defect – Defect to check.

Returns:

true iff defect 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 the NONE defect input.

Parameters:

defect – Defect to check.

Returns:

true iff defect 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 iff defect 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 iff defect 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 iff defect 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) noexcept

Returns the extent of a defect as a pair of SiDB distances in horizontal and vertical direction. If defect has the NONE defect type, {0, 0} is returned.

Parameters:

defect – Defect to evaluate.

Returns:

Number of horizontal and vertical SiDBs that are affected by the given defect.

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, true> : public Lyt
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 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.

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 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.

Returns:

All SiDB positions affected by the defect at coordinate c.

inline std::unordered_set<typename Lyt::coordinate> all_affected_sidbs() 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.

Returns:

All SiDB positions affected by any defect on the surface.

struct sidb_surface_storage

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 sidb_defect_surface<CellLyt> &surface) 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() and get_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 – Cell-level layout type that is underlying to the SiDB surface.

Parameters:
  • gate_lyt – Gate-level layout instance that specifies the aspect ratio.

  • surface – SiDB surface that instantiates the defects.

Returns:

A black list of gate functions associated with tiles.