Clocking Schemes

Header: fiction/layouts/clocking_scheme.hpp

Clocking is one of the most important differences between conventional CMOS technologies and the FCN domain. Clocking directs information flow and provides a notion of timing for both combinational and sequential circuits alike. Usually, clocking information is assigned to the coordinates of a layout by the means of a clocking scheme.

This header provides the clocking_scheme class that defines general floor plans of clock numbers for clocked layouts as well as pre-defined schemes from the literature.

template<typename ClockZone>
class clocking_scheme

Clocking scheme type that assigns a clock number to each element of the provided type ClockZone. Clocking scheme objects are utilized, e.g., in clocked_layout.

Usually, a clocking scheme is defined by the means of a cutout that can be seamlessly extended in all directions to provide repeating clock numbers.

Many regular clocking schemes have been proposed in the literature. Some are pre-defined below.

Clocking schemes are uniquely identified via their name.

Template Parameters:

ClockZone – Clock zone type. Usually, a coordinate type in a layout.

Public Functions

inline explicit clocking_scheme(std::string_view n, clock_function f, const degree in_deg, const degree out_deg, const clock_number cn = 4, const bool r = true) noexcept

Standard constructor.

Parameters:
  • n – The clocking scheme’s name. The name is utilized as the key to uniquely identify a scheme.

  • f – A function that assigns a clock number to each clock zone.

  • in_deg – Maximum possible in-degree in the provided scheme.

  • out_deg – Maximum possible out-degree in the provided scheme.

  • cn – Number of clock phases that make up one clock cycle, i.e., the number of different clock numbers.

  • r – Flag to identify the scheme as regular.

inline clock_number operator()(clock_zone cz) const noexcept

Accesses the clock function to determine the clock number of the given clock zone if the scheme is regular. Otherwise, the stored clock map is accessed to look for a manually specified/overwritten clock number. If none is found, the default one, usually 0, is returned.

Parameters:

cz – Clock zone whose clock number is desired.

Returns:

Clock number of cz.

inline bool operator==(const std::string &n) const noexcept

Compares the stored name against a given one.

Parameters:

n – Name to compare.

Returns:

true iff the stored name is equal to n.

inline bool is_regular() const noexcept

Checks for the clocking scheme’s regularity.

Returns:

true iff the clocking scheme is regular.

inline void override_clock_number(const clock_zone &cz, const clock_number cn) noexcept

Overrides a clock zone’s clock number. The usage of this function immediately labels the clocking scheme as irregular.

Parameters:
  • cz – Clock zone to override.

  • cn – Clock number to assign to cz.

Public Members

const std::string_view name

Name of the clocking scheme.

const degree max_in_degree

Maximum number of inputs the clocking scheme supports per clock zone.

const degree max_out_degree

Maximum number of outputs the clocking scheme supports per clock zone.

const clock_number num_clocks

Number of different clocks in this scheme.

Pre-defined schemes

Open

template<typename Lyt>
static auto fiction::open_clocking(const num_clks &n = num_clks::FOUR) noexcept

Returns an irregular clocking that maps every coordinate to the standard clock. It is intended to be overridden.

Template Parameters:

Lyt – Clocked layout type.

Parameters:

n – Number of clocks.

Returns:

Irregular clocking scheme.

Columnar

../_images/columnar.png
template<typename Lyt>
static auto fiction::columnar_clocking(const num_clks &n = num_clks::FOUR) noexcept

Returns a linear 1D clocking as originally introduced in “A device architecture for computing with quantum dots” by C. S. Lent and P. D. Tougaw in the Proceedings of the IEEE 1997.

Template Parameters:

Lyt – Clocked layout type.

Parameters:

n – Number of clocks.

Returns:

Columnar clocking scheme.

Row

../_images/row.png
template<typename Lyt>
static auto fiction::row_clocking(const num_clks &n = num_clks::FOUR) noexcept

Returns a 90° rotated linear 1D clocking based on the one originally introduced in “A device architecture for computing with quantum dots” by C. S. Lent and P. D. Tougaw in the Proceedings of the IEEE 1997.

Template Parameters:

Lyt – Clocked layout type.

Parameters:

n – Number of clocks.

Returns:

Row-based clocking scheme.

2DDWave

../_images/2ddwave.png
template<typename Lyt>
static auto fiction::twoddwave_clocking(const num_clks &n = num_clks::FOUR) noexcept

Returns the 2DDWave clocking as defined in “Clocking and Cell Placement for QCA” by V. Vankamamidi, M. Ottavi, and F. Lombardi in IEEE Conference on Nanotechnology 2006.

Template Parameters:

Lyt – Clocked layout type.

Parameters:

n – Number of clocks.

Returns:

2DDWave clocking scheme.

template<typename Lyt>
static auto fiction::twoddwave_hex_clocking(const num_clks &n = num_clks::FOUR) noexcept

Returns a hexagonal variation of the 2DDWave clocking as originally defined in “Clocking and Cell Placement for QCA” by V. Vankamamidi, M. Ottavi, and F. Lombardi in IEEE Conference on Nanotechnology 2006.

Template Parameters:

Lyt – Clocked layout type.

Parameters:

n – Number of clocks.

Returns:

Hexagonal 2DDWave clocking scheme.

USE

../_images/use.png
template<typename Lyt>
static auto fiction::use_clocking() noexcept

Returns the USE clocking as defined in “USE: A Universal, Scalable, and Efficient Clocking Scheme for QCA” by Caio Araujo T. Campos, Abner L. Marciano, Omar P. Vilela Neto, and Frank Sill Torres in TCAD 2015.

Template Parameters:

Lyt – Clocked layout type.

Returns:

USE clocking scheme.

RES

../_images/res.png
template<typename Lyt>
static auto fiction::res_clocking() noexcept

Returns the RES clocking as defined in “An efficient clocking scheme for quantum-dot cellular automata” by Mrinal Goswami, Anindan Mondal, Mahabub Hasan Mahalat, Bibhash Sen, and Biplab K. Sikdar in International Journal of Electronics Letters 2019.

Template Parameters:

Lyt – Clocked layout type.

Returns:

RES clocking scheme.

ESR

../_images/esr.png
template<typename Lyt>
static auto fiction::esr_clocking() noexcept

Returns the ESR clocking as defined in “An efficient, scalable, regular clocking scheme based on quantum dot cellular automata” by Jayanta Pal, Amit Kumar Pramanik, Jyotirmoy Sil Sharma, Apu Kumar Saha, and Bibhash Sen in Analog Integrated Circuits and Signal Processing 2021.

Template Parameters:

Lyt – Clocked layout type.

Returns:

ESR clocking scheme.

CFE

../_images/cfe.png
template<typename Lyt>
static auto fiction::cfe_clocking() noexcept

Returns the CFE clocking as defined in “CFE: a convenient, flexible, and efficient clocking scheme for quantum-dot cellular automata” by Feifei Deng, Guang-Jun Xie, Xin Cheng, Zhang Zhang, and Yongqiang Zhang in IET Circuits, Devices & Systems 2020.

Template Parameters:

Lyt – Clocked layout type.

Returns:

CFE clocking scheme.

Ripple

../_images/ripple.png
template<typename Lyt>
static auto fiction::ripple_clocking() noexcept

Returns the Ripple clocking as defined in “Ripple Clock Schemes for Quantum-dot Cellular Automata Circuits” by Prafull Purohit, Master Thesis, Rochester Institute of Technology, 2012.

Template Parameters:

Lyt – Clocked layout type.

Returns:

Ripple clocking scheme.

BANCS

../_images/bancs.png
template<typename Lyt>
static auto fiction::bancs_clocking() noexcept

Returns the BANCS clocking as defined in “BANCS: Bidirectional Alternating Nanomagnetic Clocking Scheme” by Ruan Evangelista Formigoni, Omar P. Vilela Neto, and Jose Augusto M. Nacif in SBCCI 2018.

Template Parameters:

Lyt – Clocked layout type.

Returns:

BANCS clocking scheme.

Utility functions

template<typename Lyt>
std::shared_ptr<clocking_scheme<clock_zone<Lyt>>> fiction::ptr(clocking_scheme<clock_zone<Lyt>> &&scheme) noexcept

Returns a smart pointer to the given scheme.

Template Parameters:

Lyt – Layout type.

Parameters:

scheme – Universal reference to a clocking scheme.

Returns:

A shared pointer to the given scheme.

template<typename Lyt>
bool fiction::is_linear_scheme(const clocking_scheme<clock_zone<Lyt>> &scheme) noexcept

Checks whether a given clocking scheme is registered as a cycle-free one. These currently are

  • COLUMNAR

  • ROW

  • 2DDWAVE

  • 2DDWAVEHEX

Template Parameters:

Lyt – Layout type.

Parameters:

scheme – Clocking scheme to check.

Returns:

true iff scheme is listed as one of the linear clocking schemes.

template<typename Lyt>
std::optional<clocking_scheme<clock_zone<Lyt>>> fiction::get_clocking_scheme(const std::string_view &name) noexcept

Returns a clocking scheme by name.

Template Parameters:

Lyt – Layout type.

Parameters:

name – Name of the desired clocking scheme.

Returns:

Clocking scheme object that matches the given name, or std::nullopt if no clocking scheme by the given name exists.