summaryrefslogtreecommitdiffstats
path: root/src/import/hwpf/fapi2/include/fapi2_target.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/hwpf/fapi2/include/fapi2_target.H')
-rw-r--r--src/import/hwpf/fapi2/include/fapi2_target.H78
1 files changed, 39 insertions, 39 deletions
diff --git a/src/import/hwpf/fapi2/include/fapi2_target.H b/src/import/hwpf/fapi2/include/fapi2_target.H
index 6f2c6793..4d9f6963 100644
--- a/src/import/hwpf/fapi2/include/fapi2_target.H
+++ b/src/import/hwpf/fapi2/include/fapi2_target.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER sbe Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* Contributors Listed Below - COPYRIGHT 2015,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -37,6 +37,7 @@
#include <vector>
#include <target_types.H>
#include <target_states.H>
+#include <multicast_defs.H>
#include <plat_target.H>
#include <return_code_defs.H>
@@ -44,8 +45,18 @@ namespace fapi2
{
///
+/// @brief Apply any platform specific static assertions to target construction
+/// @tparam K the type of target to be constructed
+/// @tparam M the multicast type of the target to be constructed
+/// @tparam V the value type of the target to be constructed
+///
+template<TargetType K, MulticastType M, typename V>
+static constexpr void plat_apply_target_limits(void);
+
+///
/// @brief Class representing a FAPI2 Target
/// @tparam K the type (Kind) of target
+/// @tparam M the type of multicast operation if it's a multicast target
/// @tparam V the type of the target's Value
/// @remark TargetLite targets are uint64_t, Targets
/// are uintptr_t (void*).
@@ -102,7 +113,7 @@ namespace fapi2
/// fapi2::Target<fapi2::TARGET_TYPE_ABUS_ENDPOINT> E;
/// takesProcOrMembuf( E );
/// @endcode
-template<TargetType K, typename V = plat_target_handle_t>
+template<TargetType K, MulticastType M = MULTICAST_OR, typename V = plat_target_handle_t>
class Target
{
public:
@@ -112,7 +123,9 @@ class Target
/// that takes in a value as a param
///
Target(): Target(V())
- {};
+ {
+ plat_apply_target_limits<K, M, V>();
+ };
///
/// @brief Create a Target, with a value
@@ -124,7 +137,9 @@ class Target
///
Target(const V& Value):
iv_handle(Value)
- {};
+ {
+ plat_apply_target_limits<K, M, V>();
+ };
///
@@ -203,7 +218,7 @@ class Target
/// @return Target<T> a target representing the parent
///
template< TargetType T >
- inline Target<T, V> getParent(void) const;
+ inline Target<T, M, V> getParent(void) const;
///
/// @brief Is this target a chip?
@@ -277,7 +292,7 @@ class Target
/// in order. That is, core 0 is std::vector[0].
///
template< TargetType T>
- inline std::vector<Target<T, V> >
+ inline std::vector<Target<T, M, V> >
getChildren(const TargetState i_state = TARGET_STATE_FUNCTIONAL) const;
///
@@ -289,7 +304,7 @@ class Target
/// children
///
template< TargetType T>
- inline std::vector<Target<T, V> >
+ inline std::vector<Target<T, M, V> >
getChildren(const TargetFilter i_filter,
const TargetState i_state = TARGET_STATE_FUNCTIONAL) const;
@@ -305,7 +320,7 @@ class Target
template<TargetType T>
inline fapi2::ReturnCodes
- getOtherEnd(Target<T, V>& o_target, const TargetState i_state = TARGET_STATE_FUNCTIONAL) const;
+ getOtherEnd(Target<T, M, V>& o_target, const TargetState i_state = TARGET_STATE_FUNCTIONAL) const;
///
/// @brief Is the target functional?
@@ -329,10 +344,12 @@ class Target
/// @brief Copy from a Target<O> to a Target<K>
/// @tparam O the target type of the other
///
- template<TargetType O, typename VO>
- inline Target( const Target<O, VO>& Other ):
- Target<K, V>(Other.get())
+ template<TargetType O, MulticastType MO, typename VO>
+ inline Target( const Target<O, MO, VO>& Other ):
+ Target<K, M, V>(Other.get())
{
+ plat_apply_target_limits<K, M, V>();
+
// In case of recursion depth failure, use -ftemplate-depth=
static_assert( (K & O) != 0,
"unable to cast Target, no shared types");
@@ -347,6 +364,8 @@ class Target
static const TargetType iv_type = K;
V iv_handle;
+ /// @brief if iv_handle is a multicast target, update its multicast type to M
+ inline void mcUpdateHandle();
};
// EX threads map to CORE threads:
@@ -475,8 +494,8 @@ inline uint8_t thread_bitset_f2n(const uint8_t i_ordinal, const uint8_t i_thread
/// @post The contents of the buffer is replaced with the string
/// representation of the target
///
-template< TargetType T, typename V >
-inline void toString(const Target<T, V>& i_target, char* i_buffer, size_t i_bsize);
+template< TargetType T, MulticastType M, typename V >
+inline void toString(const Target<T, M, V>& i_target, char* i_buffer, size_t i_bsize);
///
/// @brief Return the string interpretation of this target
@@ -489,8 +508,8 @@ inline void toString(const Target<T, V>& i_target, char* i_buffer, size_t i_bsiz
/// @post The contents of the buffer is replaced with the string
/// representation of the target
///
-template< TargetType T, typename V >
-inline void toString(const Target<T, V>* i_target, char* i_buffer, size_t i_bsize);
+template< TargetType T, MulticastType M, typename V >
+inline void toString(const Target<T, M, V>* i_target, char* i_buffer, size_t i_bsize);
///
/// @brief Get an enumerated target of a specific type
@@ -499,28 +518,8 @@ inline void toString(const Target<T, V>* i_target, char* i_buffer, size_t i_bsiz
/// the desired target
/// @return Target<T> the target requested
///
-template<TargetType T, typename V = plat_target_handle_t>
-inline Target<T, V> getTarget(uint64_t Ordinal);
-
-// Why has the been removed? For starters, the API name
-// is probably wrong as it's already been confused with
-// Target::getChildren(). And if I'm going to change it
-// I really want to see if we need it. I'm still not
-// clear on whether we're alloing this traversal or not.
-#if 0
-///
-/// @brief Get the base target's children
-/// @tparam T The type of the target
-/// @return std::vector<Target<T,V>> a vector of present/functional
-/// children
-///
-template<TargetType T, typename V>
-inline std::vector<Target<T, V>> getChildren()
-{
- // For testing
- return {Target<T, V>(), Target<T, V>()};
-}
-#endif
+template<TargetType T, MulticastType M = MULTICAST_OR, typename V = plat_target_handle_t>
+inline Target<T, M, V> getTarget(uint64_t Ordinal);
///
/// @brief Return the string interpretation of this target
@@ -532,8 +531,8 @@ inline std::vector<Target<T, V>> getChildren()
/// @post The contents of the buffer is replaced with the string
/// representation of the target
///
-template<TargetType T, typename V, typename B>
-inline void toString(const Target<T, V>& i_target, B& i_buffer);
+template<TargetType T, MulticastType M, typename V, typename B>
+inline void toString(const Target<T, M, V>& i_target, B& i_buffer);
///
/// @brief Check if the target is of a type, or in a type subset.
@@ -546,6 +545,7 @@ inline constexpr bool is_same(void)
{
return (K & T) != 0;
}
+
}
#endif
OpenPOWER on IntegriCloud