diff --git a/src/dft/src/architect/CMakeLists.txt b/src/dft/src/architect/CMakeLists.txt index 1d8f0ca12a3..556071c6b29 100644 --- a/src/dft/src/architect/CMakeLists.txt +++ b/src/dft/src/architect/CMakeLists.txt @@ -10,6 +10,7 @@ target_link_libraries(dft_architect_lib PRIVATE dft_base_scan_cell_lib dft_clock_domain_lib + dft_clock_domain_hash_lib dft_config_lib dft_utils_scan_pin_lib ) diff --git a/src/dft/src/architect/ScanArchitect.cpp b/src/dft/src/architect/ScanArchitect.cpp index 33bc4cccca9..faa6a519714 100644 --- a/src/dft/src/architect/ScanArchitect.cpp +++ b/src/dft/src/architect/ScanArchitect.cpp @@ -33,6 +33,7 @@ #include "ScanArchitect.hh" #include "ClockDomain.hh" +#include "ClockDomainHash.hh" #include "ScanArchitectHeuristic.hh" namespace dft { diff --git a/src/dft/src/clock_domain/CMakeLists.txt b/src/dft/src/clock_domain/CMakeLists.txt index 0d902f87477..999d3e7eada 100644 --- a/src/dft/src/clock_domain/CMakeLists.txt +++ b/src/dft/src/clock_domain/CMakeLists.txt @@ -2,14 +2,27 @@ add_library(dft_clock_domain_lib # Keep sorted ClockDomain.cpp ) - target_include_directories(dft_clock_domain_lib PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) - target_link_libraries(dft_clock_domain_lib PRIVATE utl_lib dft_config_lib ) + +add_library(dft_clock_domain_hash_lib + # Keep sorted + ClockDomainHash.cpp +) +target_include_directories(dft_clock_domain_hash_lib + PUBLIC + ${CMAKE_CURRENT_LIST_DIR} +) +target_link_libraries(dft_clock_domain_hash_lib + PRIVATE + utl_lib + dft_config_lib + dft_clock_domain_lib +) diff --git a/src/dft/src/clock_domain/ClockDomain.cpp b/src/dft/src/clock_domain/ClockDomain.cpp index dbabacd0e06..17ccff4489d 100644 --- a/src/dft/src/clock_domain/ClockDomain.cpp +++ b/src/dft/src/clock_domain/ClockDomain.cpp @@ -34,25 +34,6 @@ namespace dft { -std::function GetClockDomainHashFn( - const ScanArchitectConfig& config, - utl::Logger* logger) -{ - switch (config.getClockMixing()) { - // For NoMix, every clock domain is different - case ScanArchitectConfig::ClockMixing::NoMix: - return [](const ClockDomain& clock_domain) { - return std::hash{}(clock_domain.getClockName()) - ^ std::hash{}(clock_domain.getClockEdge()); - }; - case ScanArchitectConfig::ClockMixing::ClockMix: - return [](const ClockDomain& clock_domain) { return 1; }; - default: - // Not implemented - logger->error(utl::DFT, 4, "Clock mix config requested is not supported"); - } -} - ClockDomain::ClockDomain(const std::string& clock_name, ClockEdge clock_edge) : clock_name_(clock_name), clock_edge_(clock_edge) { diff --git a/src/dft/src/clock_domain/ClockDomain.hh b/src/dft/src/clock_domain/ClockDomain.hh index 30235306edf..d8e0bc07a0e 100644 --- a/src/dft/src/clock_domain/ClockDomain.hh +++ b/src/dft/src/clock_domain/ClockDomain.hh @@ -31,12 +31,7 @@ // POSSIBILITY OF SUCH DAMAGE. #pragma once -#include -#include #include -#include - -#include "ScanArchitectConfig.hh" namespace dft { @@ -67,19 +62,4 @@ class ClockDomain ClockEdge clock_edge_; }; -// Depending on the ScanArchitectConfig's clock mixing setting, there are -// different ways to calculate the hash of the clock domain. -// -// For No Mix clock, we will generate a different hash value for all the clock -// domains. -// -// If we want to mix all the clocks, then the hash will be the same for all the -// clock doamins. -// -// We refer to the generated hash from a ClockDomain as Hash Domain. -// -std::function GetClockDomainHashFn( - const ScanArchitectConfig& config, - utl::Logger* logger); - } // namespace dft diff --git a/src/dft/src/clock_domain/ClockDomainHash.cpp b/src/dft/src/clock_domain/ClockDomainHash.cpp new file mode 100644 index 00000000000..159308942bf --- /dev/null +++ b/src/dft/src/clock_domain/ClockDomainHash.cpp @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////////// +// BSD 3-Clause License +// +// Copyright (c) 2024, Google LLC +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#include "ClockDomainHash.hh" + +namespace dft { + +std::function GetClockDomainHashFn( + const ScanArchitectConfig& config, + utl::Logger* logger) +{ + switch (config.getClockMixing()) { + // For NoMix, every clock domain is different + case ScanArchitectConfig::ClockMixing::NoMix: + return [](const ClockDomain& clock_domain) { + return std::hash{}(clock_domain.getClockName()) + ^ std::hash{}(clock_domain.getClockEdge()); + }; + case ScanArchitectConfig::ClockMixing::ClockMix: + return [](const ClockDomain& clock_domain) { return 1; }; + default: + // Not implemented + logger->error(utl::DFT, 4, "Clock mix config requested is not supported"); + } +} + +} // namespace dft diff --git a/src/dft/src/clock_domain/ClockDomainHash.hh b/src/dft/src/clock_domain/ClockDomainHash.hh new file mode 100644 index 00000000000..293fe4a1c8d --- /dev/null +++ b/src/dft/src/clock_domain/ClockDomainHash.hh @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////////// +// BSD 3-Clause License +// +// Copyright (c) 2024, Google LLC +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +#pragma once + +#include + +#include "ClockDomain.hh" +#include "ScanArchitectConfig.hh" + +namespace dft { + +// Depending on the ScanArchitectConfig's clock mixing setting, there are +// different ways to calculate the hash of the clock domain. +// +// For No Mix clock, we will generate a different hash value for all the clock +// domains. +// +// If we want to mix all the clocks, then the hash will be the same for all the +// clock doamins. +// +// We refer to the generated hash from a ClockDomain as Hash Domain. +// +std::function GetClockDomainHashFn( + const ScanArchitectConfig& config, + utl::Logger* logger); + +} // namespace dft