#pragma once #include #include #include #include #include namespace trygvis { namespace kicad { template using opt = std::experimental::optional; using std::experimental::nullopt; } // namespace kicad } // namespace trygvis namespace trygvis { namespace kicad { namespace netlist { struct lib_source { const std::string lib; const std::string part; lib_source(const std::string &lib, const std::string &part) : lib(lib), part(part) {} }; struct component { const std::string ref; const std::string value; const lib_source _lib_source; component(const std::string &ref, const std::string &value, const lib_source &_lib_source) : ref(ref), value(value), _lib_source(_lib_source) {} }; struct pin { int num; std::string name; std::string type; }; struct part { std::vector pins; }; class node { public: const std::string ref; const int pin; node(const std::string &ref, int pin) : ref(ref), pin(pin) {} }; class net { public: const int code; const std::string name; const std::vector nodes; net(int code, const std::string &name, const std::vector &nodes) : code(code), name(name), nodes(nodes) {} const node *node_for_ref(const std::string &ref) const; }; struct netlist { std::vector components; std::vector parts; std::vector nets; opt find_component(const std::string &ref) const; std::vector find_usage_of(const std::string &ref) const; }; class kicad_parse_exception : public std::runtime_error { public: explicit kicad_parse_exception(const std::vector &messages) : runtime_error("Parse error"), messages(messages) {} ~kicad_parse_exception() {} const std::vector messages; }; class kicad_net_loader { public: kicad_net_loader(); virtual ~kicad_net_loader(); netlist load(std::string path, std::ostream &err); void setDebug(bool debug); private: bool debug_; }; } // namespace netlist } // namespace kicad } // namespace trygvis