#ifndef FLUXSINK_H #define FLUXSINK_H #include "flags.h" #include class Fluxmap; class FluxSinkProto; class HardwareFluxSinkProto; class AuFluxSinkProto; class A2RFluxSinkProto; class VcdFluxSinkProto; class ScpFluxSinkProto; class Fl2FluxSinkProto; class FluxSink { public: virtual ~FluxSink() {} static std::unique_ptr createHardwareFluxSink( const HardwareFluxSinkProto& config); static std::unique_ptr createAuFluxSink( const AuFluxSinkProto& config); static std::unique_ptr createA2RFluxSink( const A2RFluxSinkProto& config); static std::unique_ptr createVcdFluxSink( const VcdFluxSinkProto& config); static std::unique_ptr createScpFluxSink( const ScpFluxSinkProto& config); static std::unique_ptr createFl2FluxSink( const Fl2FluxSinkProto& config); static std::unique_ptr createFl2FluxSink( const std::string& filename); static std::unique_ptr create(const FluxSinkProto& config); public: /* Writes a fluxmap to a track and side. */ virtual void writeFlux(int track, int side, const Fluxmap& fluxmap) = 0; /* Returns whether this is writing to real hardware or not. */ virtual bool isHardware() const { return false; } virtual operator std::string() const = 0; }; inline std::ostream& operator<<(std::ostream& stream, FluxSink& flushSink) { stream << (std::string)flushSink; return stream; } #endif