Poplar and PopLibs
InOutTypes.hpp
1// Copyright (c) 2018 Graphcore Ltd. All rights reserved.
2
3#ifndef _poplar_InOutTypes_hpp_
4#define _poplar_InOutTypes_hpp_
5#include <cstdint>
6#include <poplar/Iterators.hpp>
7#include <poplar/QuarterFloat.hpp>
8
9namespace poplar {
10
11template <typename T> struct IOBase { void *p; };
12
13template <> struct IOBase<quarter> {
14 void *p;
15 void *meta;
16};
17
18// This is needed if we ever use the '-finstrument-function'. We don't want
19// these functions to be instrumented.
20#define NO_INSTRUMENT __attribute__((no_instrument_function))
21
22template <typename T> class InputBase : public IOBase<T> {
23public:
24 using type = const T;
25 using baseT = const T;
26
27 NO_INSTRUMENT
28 operator const T &() const { return *((T *)IOBase<T>::p); }
29
30 NO_INSTRUMENT
31 const T &operator*() const { return *((T *)IOBase<T>::p); }
32
33 NO_INSTRUMENT
34 const T *operator->() const { return (T *)IOBase<T>::p; }
35};
36
37template <typename T> class OutputBase : public IOBase<T> {
38public:
39 using baseT = T;
40
41 NO_INSTRUMENT
42 operator T &() const { return *((T *)IOBase<T>::p); }
43
44 NO_INSTRUMENT
45 T &operator*() const { return *((T *)IOBase<T>::p); }
46
47 NO_INSTRUMENT
48 T *operator->() const { return (T *)IOBase<T>::p; }
49};
50
51template <typename T> class InOutBase : public IOBase<T> {
52public:
53 using baseT = T;
54
55 NO_INSTRUMENT
56 operator T &() const { return *((T *)IOBase<T>::p); }
57
58 NO_INSTRUMENT
59 T &operator*() const { return *((T *)IOBase<T>::p); }
60
61 NO_INSTRUMENT
62 T *operator->() const { return (T *)IOBase<T>::p; }
63};
64
66template <typename T> class Input : public InputBase<T> {};
67
69template <> class Input<quarter> : public InputBase<quarter> {
70public:
71 NO_INSTRUMENT
72 const MetadataType *getMetadata() const { return (const MetadataType *)meta; }
73};
74
76template <typename T> class Output : public OutputBase<T> {};
77
79template <> class Output<quarter> : public OutputBase<quarter> {
80public:
81 NO_INSTRUMENT
82 const MetadataType *getMetadata() const { return (MetadataType *)meta; }
83};
84
86template <typename T> class InOut : public InOutBase<T> {};
87
89template <> class InOut<quarter> : public InOutBase<quarter> {
90public:
91 NO_INSTRUMENT
92 const MetadataType *getMetadata() const { return (MetadataType *)meta; }
93};
94
95} // namespace poplar
96
97#endif // _poplar_InOutTypes_hpp_
Input.
Definition: InOutTypes.hpp:86
Input.
Definition: InOutTypes.hpp:66
Output.
Definition: InOutTypes.hpp:76
Poplar classes and functions.
Definition: ArrayRef.hpp:14