KiCad PCB EDA Suite
Loading...
Searching...
No Matches
conn_inputs.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20#pragma once
21
22#include "conn_facts.h"
23#include "conn_keys.h"
24#include "conn_cache.h"
25#include "conn_islands.h"
26#include "conn_frame.h"
28#include <set>
29#include <span>
30#include <algorithm>
31#include <optional>
32
33namespace SCH_CONNECTIVITY
34{
41{
42public:
43 using SOURCE_KEY = std::pair<SCREEN_ID, KIID>;
49 using UNIT_SIGNATURE = std::vector<std::pair<KIID, int>>;
50 using ISLAND_KEY = std::pair<SCREEN_ID, UNIT_SIGNATURE>;
51 using UNIT_VIEW = std::span<const std::pair<KIID, int>>;
52 using ISLAND_LOOKUP = std::pair<SCREEN_ID, UNIT_VIEW>;
53
55 {
56 using is_transparent = void;
57
58 template <typename LEFT, typename RIGHT>
59 bool operator()( const LEFT& aLeft, const RIGHT& aRight ) const
60 {
61 if( aLeft.first != aRight.first )
62 return aLeft.first < aRight.first;
63
64 return std::lexicographical_compare( aLeft.second.begin(), aLeft.second.end(), aRight.second.begin(),
65 aRight.second.end() );
66 }
67 };
70
71 INPUT_STORE( CACHE_VERSIONS& aVersions, SESSION_KEYS& aKeys );
72
73 // Refresh current instance inputs, then reconcile deletions after successful extraction.
74 std::vector<FRAME_INSTANCE> Capture( const SCH_SHEET_LIST& aPaths, uint64_t aTextEpoch );
75
83 bool ExternalSourcesChanged( const SCH_SHEET_LIST& aPaths, bool aContextUnchanged = false ) const;
84
85 const SCREEN_CACHE::ENTRY& Screen( const SCH_SCREEN& aScreen );
86
87 // The caller advances textEpoch for cross-object text, hierarchy, project and variant edits.
88 const INSTANCE_CACHE::ENTRY& Instance( const SCH_SCREEN& aScreen, const SCH_SHEET_PATH& aPath,
89 uint64_t aTextEpoch );
90
91 const FACT_CACHE::ENTRY* Fact( const SOURCE_KEY& aKey ) const { return m_facts.Find( aKey ); }
92 const TEXT_CACHE::ENTRY* Text( const ITEM_KEY& aKey ) const { return m_text.Find( aKey ); }
93 const AREA_CACHE::ENTRY* Area( const ITEM_KEY& aKey ) const { return m_areas.Find( aKey ); }
94 const SCREEN_CACHE::ENTRY* FindScreen( SCREEN_ID aScreen ) const { return m_screens.Find( aScreen ); }
95 const INSTANCE_CACHE::ENTRY* FindInstance( INST_ID aInstance ) const { return m_instances.Find( aInstance ); }
96 const INSTANCE_CACHE& Instances() const { return m_instances; }
97
98 SCREEN_ID InstanceScreen( INST_ID aInstance ) const { return m_instanceInputs.at( aInstance ).screen; }
99
100 const SCREEN_FACTS& InstanceScreenFacts( INST_ID aInstance ) const
101 {
102 return m_screens.Entries().at( InstanceScreen( aInstance ) )->value;
103 }
104
105 const GEOMETRY_CACHE::ENTRY& Geometry( SCREEN_ID aScreen );
106 const ISLAND_CACHE::ENTRY& Islands( SCREEN_ID aScreen, const UNIT_SIGNATURE& aUnits );
107
108 const ISLAND_CACHE::ENTRY* FindIslands( SCREEN_ID aScreen, UNIT_VIEW aUnits ) const
109 {
110 return m_islands.Find( ISLAND_LOOKUP{ aScreen, aUnits } );
111 }
112
113 const std::map<SCREEN_ID, uint64_t>& ScreenRevisions() const { return m_screenRevisions; }
114
115 // Verified non-line source identity of a captured screen.
116 std::optional<std::pair<SCREEN_ID, uint64_t>> VerifiedSymbolSource( SCREEN_ID aScreen ) const
117 {
118 const auto found = m_symbolRevisions.find( aScreen );
119
120 if( found == m_symbolRevisions.end() )
121 return std::nullopt;
122
123 return std::pair{ aScreen, found->second };
124 }
125
126 // Consulted values from the last extraction; pointer valid until this instance changes or is erased.
128 {
129 const auto found = m_instanceSources.find( aInstance );
130 return found == m_instanceSources.end() ? nullptr : &found->second;
131 }
132
133 void Retain( const std::set<SCREEN_ID>& aScreens, const std::set<INST_ID>& aInstances );
139 void Invalidate();
140 void Clear();
141
142private:
143 const SCREEN_CACHE::ENTRY& storeScreen( const SCH_SCREEN& aScreen, SCREEN_FACTS aFacts );
144
146 {
148 uint64_t revision;
149 uint64_t textEpoch;
152 bool operator==( const INSTANCE_INPUT& ) const = default;
153 };
154
163 std::map<SCREEN_ID, uint64_t> m_geometryInputs;
164 std::map<ISLAND_KEY, uint64_t, ISLAND_LESS> m_islandInputs;
165 std::map<SCREEN_ID, uint64_t> m_screenRevisions;
166 std::map<SCREEN_ID, uint64_t> m_symbolRevisions;
167 std::map<INST_ID, INSTANCE_INPUT> m_instanceInputs;
168 std::map<INST_ID, TEXT_EVAL::ENVIRONMENT::SOURCE_VALUES> m_instanceSources;
169};
170} // namespace SCH_CONNECTIVITY
Versioned value table.
Definition conn_cache.h:61
One sequence for all cache tables for the lifetime of an engine session.
Definition conn_cache.h:37
std::map< SCREEN_ID, uint64_t > m_screenRevisions
CACHE_TABLE< INST_ID, INSTANCE_FACTS > INSTANCE_CACHE
Definition conn_inputs.h:46
INPUT_STORE(CACHE_VERSIONS &aVersions, SESSION_KEYS &aKeys)
std::map< INST_ID, TEXT_EVAL::ENVIRONMENT::SOURCE_VALUES > m_instanceSources
const ISLAND_CACHE::ENTRY & Islands(SCREEN_ID aScreen, const UNIT_SIGNATURE &aUnits)
const AREA_CACHE::ENTRY * Area(const ITEM_KEY &aKey) const
Definition conn_inputs.h:93
std::pair< SCREEN_ID, UNIT_VIEW > ISLAND_LOOKUP
Definition conn_inputs.h:52
CACHE_TABLE< SCREEN_ID, SCREEN_GEOMETRY > GEOMETRY_CACHE
Definition conn_inputs.h:68
void Retain(const std::set< SCREEN_ID > &aScreens, const std::set< INST_ID > &aInstances)
const TEXT_CACHE::ENTRY * Text(const ITEM_KEY &aKey) const
Definition conn_inputs.h:92
const SCREEN_CACHE::ENTRY & Screen(const SCH_SCREEN &aScreen)
const INSTANCE_CACHE & Instances() const
Definition conn_inputs.h:96
const SCREEN_CACHE::ENTRY * FindScreen(SCREEN_ID aScreen) const
Definition conn_inputs.h:94
std::map< ISLAND_KEY, uint64_t, ISLAND_LESS > m_islandInputs
CACHE_TABLE< ITEM_KEY, ITEM_TEXT_FACT, KEY_LESS > TEXT_CACHE
Definition conn_inputs.h:47
const INSTANCE_CACHE::ENTRY & Instance(const SCH_SCREEN &aScreen, const SCH_SHEET_PATH &aPath, uint64_t aTextEpoch)
std::map< INST_ID, INSTANCE_INPUT > m_instanceInputs
const GEOMETRY_CACHE::ENTRY & Geometry(SCREEN_ID aScreen)
const TEXT_EVAL::ENVIRONMENT::SOURCE_VALUES * Sources(INST_ID aInstance) const
CACHE_TABLE< SOURCE_KEY, ITEM_FACT > FACT_CACHE
Definition conn_inputs.h:45
std::vector< FRAME_INSTANCE > Capture(const SCH_SHEET_LIST &aPaths, uint64_t aTextEpoch)
void Invalidate()
Force fresh extraction and geometry, retaining primitive values only for change comparison.
std::span< const std::pair< KIID, int > > UNIT_VIEW
Definition conn_inputs.h:51
const SCREEN_FACTS & InstanceScreenFacts(INST_ID aInstance) const
std::vector< std::pair< KIID, int > > UNIT_SIGNATURE
Definition conn_inputs.h:49
SCREEN_ID InstanceScreen(INST_ID aInstance) const
Definition conn_inputs.h:98
std::pair< SCREEN_ID, UNIT_SIGNATURE > ISLAND_KEY
Definition conn_inputs.h:50
const ISLAND_CACHE::ENTRY * FindIslands(SCREEN_ID aScreen, UNIT_VIEW aUnits) const
std::pair< SCREEN_ID, KIID > SOURCE_KEY
Definition conn_inputs.h:43
const INSTANCE_CACHE::ENTRY * FindInstance(INST_ID aInstance) const
Definition conn_inputs.h:95
CACHE_TABLE< SCREEN_ID, SCREEN_FACTS > SCREEN_CACHE
Definition conn_inputs.h:44
const std::map< SCREEN_ID, uint64_t > & ScreenRevisions() const
std::map< SCREEN_ID, uint64_t > m_geometryInputs
CACHE_TABLE< ISLAND_KEY, SCREEN_ISLANDS, ISLAND_LESS > ISLAND_CACHE
Definition conn_inputs.h:69
const FACT_CACHE::ENTRY * Fact(const SOURCE_KEY &aKey) const
Definition conn_inputs.h:91
std::optional< std::pair< SCREEN_ID, uint64_t > > VerifiedSymbolSource(SCREEN_ID aScreen) const
const SCREEN_CACHE::ENTRY & storeScreen(const SCH_SCREEN &aScreen, SCREEN_FACTS aFacts)
bool ExternalSourcesChanged(const SCH_SHEET_LIST &aPaths, bool aContextUnchanged=false) const
Compare retained external inputs for current instance/screen pairs, excluding model/revision changes.
std::map< SCREEN_ID, uint64_t > m_symbolRevisions
CACHE_TABLE< ITEM_KEY, INSTANCE_RULE_AREA_FACT, KEY_LESS > AREA_CACHE
Definition conn_inputs.h:48
Session IDs are dense handles, never a canonical ordering.
Definition conn_keys.h:146
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Value keys and the key session of the schematic connectivity engine.
uint32_t INST_ID
Session handle of a sheet instance KIID_PATH.
Definition conn_keys.h:41
uint64_t SCREEN_ID
Process-local SCH_SCREEN::ConnectivityId(), never a file UUID.
Definition conn_keys.h:44
bool operator==(const INSTANCE_INPUT &) const =default
bool operator()(const LEFT &aLeft, const RIGHT &aRight) const
Definition conn_inputs.h:59
One item or pin in one sheet instance.
Definition conn_keys.h:77
The value copy of one screen.
Definition conn_facts.h:251