From fe4608386eb163c70a75ed84beb07516af378b36 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Fri, 12 Mar 2021 13:09:44 -0800 Subject: Split nextpnr.h to allow for linear inclusion. "nextpnr.h" is no longer the god header. Important improvements: - Functions in log.h can be used without including BaseCtx/Arch/Context. This means that log_X functions can be called without included "nextpnr.h" - NPNR_ASSERT can be used without including "nextpnr.h" by including "nextpnr_assertions.h". This allows NPNR_ASSERT to be used safely in any header file. - Types defined in "archdefs.h" are now available without including BaseCtx/Arch/Context. This means that utility classes that will be used inside of BaseCtx/Arch/Context can be defined safely in a self-contained header. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- common/context.h | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 common/context.h (limited to 'common/context.h') diff --git a/common/context.h b/common/context.h new file mode 100644 index 00000000..a5553422 --- /dev/null +++ b/common/context.h @@ -0,0 +1,103 @@ +/* + * nextpnr -- Next Generation Place and Route + * + * Copyright (C) 2018 Clifford Wolf + * Copyright (C) 2018 Serge Bazanski + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef CONTEXT_H +#define CONTEXT_H + +#include + +#include "arch.h" +#include "deterministic_rng.h" + +NEXTPNR_NAMESPACE_BEGIN + +struct Context : Arch, DeterministicRNG +{ + bool verbose = false; + bool debug = false; + bool force = false; + + // Should we disable printing of the location of nets in the critical path? + bool disable_critical_path_source_print = false; + + Context(ArchArgs args) : Arch(args) { BaseCtx::as_ctx = this; } + + // -------------------------------------------------------------- + + WireId getNetinfoSourceWire(const NetInfo *net_info) const; + SSOArray getNetinfoSinkWires(const NetInfo *net_info, const PortRef &sink) const; + size_t getNetinfoSinkWireCount(const NetInfo *net_info, const PortRef &sink) const; + WireId getNetinfoSinkWire(const NetInfo *net_info, const PortRef &sink, size_t phys_idx) const; + delay_t getNetinfoRouteDelay(const NetInfo *net_info, const PortRef &sink) const; + + // provided by router1.cc + bool checkRoutedDesign() const; + bool getActualRouteDelay(WireId src_wire, WireId dst_wire, delay_t *delay = nullptr, + std::unordered_map *route = nullptr, bool useEstimate = true); + + // -------------------------------------------------------------- + // call after changing hierpath or adding/removing nets and cells + void fixupHierarchy(); + + // -------------------------------------------------------------- + + // provided by sdf.cc + void writeSDF(std::ostream &out, bool cvc_mode = false) const; + + // -------------------------------------------------------------- + + // provided by svg.cc + void writeSVG(const std::string &filename, const std::string &flags = "") const; + + // -------------------------------------------------------------- + + uint32_t checksum() const; + + void check() const; + void archcheck() const; + + template T setting(const char *name, T defaultValue) + { + IdString new_id = id(name); + auto found = settings.find(new_id); + if (found != settings.end()) + return boost::lexical_cast(found->second.is_string ? found->second.as_string() + : std::to_string(found->second.as_int64())); + else + settings[id(name)] = std::to_string(defaultValue); + + return defaultValue; + } + + template T setting(const char *name) const + { + IdString new_id = id(name); + auto found = settings.find(new_id); + if (found != settings.end()) + return boost::lexical_cast(found->second.is_string ? found->second.as_string() + : std::to_string(found->second.as_int64())); + else + throw std::runtime_error("settings does not exists"); + } +}; + +NEXTPNR_NAMESPACE_END + +#endif /* CONTEXT_H */ -- cgit v1.2.3