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

-
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

-
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

-
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

-
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

-
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

-
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

-
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

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

-
template<typename Lyt>
static auto fiction::srs_clocking() noexcept Returns the SRS clocking as defined in “Simple, robust and systematic QCA clocking scheme for area-efficient nanocircuits” by Mrinal Goswami, Tonmoy Jyoti Sharma, and Arpita Nath Boruah in International Journal of Electronics Letters 2025.
- Template Parameters:
Lyt – Clocked layout type.
- Returns:
SRS clocking scheme.
BANCS

-
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
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
iffscheme
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
, orstd::nullopt
if no clocking scheme by the givenname
exists.