diff options
-rw-r--r-- | utils/regtools/qeditor/analyser.cpp | 2 | ||||
-rw-r--r-- | utils/regtools/qeditor/analyser.h | 10 | ||||
-rw-r--r-- | utils/regtools/qeditor/backend.cpp | 422 | ||||
-rw-r--r-- | utils/regtools/qeditor/backend.h | 208 | ||||
-rw-r--r-- | utils/regtools/qeditor/main.cpp | 12 | ||||
-rw-r--r-- | utils/regtools/qeditor/mainwindow.cpp | 27 | ||||
-rw-r--r-- | utils/regtools/qeditor/mainwindow.h | 13 | ||||
-rw-r--r-- | utils/regtools/qeditor/qeditor.pro | 2 | ||||
-rw-r--r-- | utils/regtools/qeditor/regdisplaypanel.cpp | 157 | ||||
-rw-r--r-- | utils/regtools/qeditor/regdisplaypanel.h | 36 | ||||
-rw-r--r-- | utils/regtools/qeditor/regedit.cpp | 2222 | ||||
-rw-r--r-- | utils/regtools/qeditor/regedit.h | 276 | ||||
-rw-r--r-- | utils/regtools/qeditor/regtab.cpp | 152 | ||||
-rw-r--r-- | utils/regtools/qeditor/regtab.h | 13 | ||||
-rw-r--r-- | utils/regtools/qeditor/std_analysers.cpp | 429 | ||||
-rw-r--r-- | utils/regtools/qeditor/std_analysers.h | 26 | ||||
-rw-r--r-- | utils/regtools/qeditor/utils.cpp | 644 | ||||
-rw-r--r-- | utils/regtools/qeditor/utils.h | 169 |
18 files changed, 2912 insertions, 1908 deletions
diff --git a/utils/regtools/qeditor/analyser.cpp b/utils/regtools/qeditor/analyser.cpp index 7b60dcffcd..aa422cbc6f 100644 --- a/utils/regtools/qeditor/analyser.cpp +++ b/utils/regtools/qeditor/analyser.cpp | |||
@@ -20,7 +20,7 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include "analyser.h" | 21 | #include "analyser.h" |
22 | 22 | ||
23 | Analyser::Analyser(const SocRef& soc, IoBackend *backend) | 23 | Analyser::Analyser(const soc_desc::soc_ref_t& soc, IoBackend *backend) |
24 | :m_soc(soc), m_io_backend(backend) | 24 | :m_soc(soc), m_io_backend(backend) |
25 | { | 25 | { |
26 | } | 26 | } |
diff --git a/utils/regtools/qeditor/analyser.h b/utils/regtools/qeditor/analyser.h index 83b0a9c469..a099399a3b 100644 --- a/utils/regtools/qeditor/analyser.h +++ b/utils/regtools/qeditor/analyser.h | |||
@@ -30,13 +30,13 @@ | |||
30 | class Analyser : public RegTabPanel | 30 | class Analyser : public RegTabPanel |
31 | { | 31 | { |
32 | public: | 32 | public: |
33 | Analyser(const SocRef& soc, IoBackend *backend); | 33 | Analyser(const soc_desc::soc_ref_t& soc, IoBackend *backend); |
34 | virtual ~Analyser(); | 34 | virtual ~Analyser(); |
35 | virtual void AllowWrite(bool en) { Q_UNUSED(en); } | 35 | virtual void AllowWrite(bool en) { Q_UNUSED(en); } |
36 | virtual QWidget *GetWidget() = 0; | 36 | virtual QWidget *GetWidget() = 0; |
37 | 37 | ||
38 | protected: | 38 | protected: |
39 | const SocRef& m_soc; | 39 | soc_desc::soc_ref_t m_soc; |
40 | IoBackend *m_io_backend; | 40 | IoBackend *m_io_backend; |
41 | }; | 41 | }; |
42 | 42 | ||
@@ -49,7 +49,7 @@ public: | |||
49 | virtual QString GetName() = 0; | 49 | virtual QString GetName() = 0; |
50 | virtual bool SupportSoc(const QString& soc_name) = 0; | 50 | virtual bool SupportSoc(const QString& soc_name) = 0; |
51 | // return NULL of soc is not handled by the analyser | 51 | // return NULL of soc is not handled by the analyser |
52 | virtual Analyser *Create(const SocRef& soc, IoBackend *backend) = 0; | 52 | virtual Analyser *Create(const soc_desc::soc_ref_t& soc, IoBackend *backend) = 0; |
53 | private: | 53 | private: |
54 | QString m_name; | 54 | QString m_name; |
55 | 55 | ||
@@ -72,9 +72,9 @@ public: | |||
72 | virtual QString GetName() { return m_name; } | 72 | virtual QString GetName() { return m_name; } |
73 | virtual bool SupportSoc(const QString& soc_name) { return T::SupportSoc(soc_name); } | 73 | virtual bool SupportSoc(const QString& soc_name) { return T::SupportSoc(soc_name); } |
74 | // return NULL of soc is not handled by the analyser | 74 | // return NULL of soc is not handled by the analyser |
75 | virtual T *Create(const SocRef& soc, IoBackend *backend) | 75 | virtual T *Create(const soc_desc::soc_ref_t& soc, IoBackend *backend) |
76 | { | 76 | { |
77 | if(!T::SupportSoc(soc.GetSoc().name.c_str())) | 77 | if(!T::SupportSoc(QString::fromStdString(soc.get()->name))) |
78 | return 0; | 78 | return 0; |
79 | return new T(soc, backend); | 79 | return new T(soc, backend); |
80 | } | 80 | } |
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp index cbaff7370d..5f006b0aa7 100644 --- a/utils/regtools/qeditor/backend.cpp +++ b/utils/regtools/qeditor/backend.cpp | |||
@@ -28,15 +28,15 @@ | |||
28 | * SocFile | 28 | * SocFile |
29 | */ | 29 | */ |
30 | SocFile::SocFile() | 30 | SocFile::SocFile() |
31 | :m_valid(false) | 31 | :m_valid(true) |
32 | { | 32 | { |
33 | } | 33 | } |
34 | 34 | ||
35 | SocFile::SocFile(const QString& filename) | 35 | SocFile::SocFile(const QString& filename) |
36 | :m_filename(filename) | 36 | :m_filename(filename) |
37 | { | 37 | { |
38 | m_valid = parse_xml(filename.toStdString(), m_soc); | 38 | soc_desc::error_context_t ctx; |
39 | normalize(m_soc); | 39 | m_valid = soc_desc::parse_xml(filename.toStdString(), m_soc, ctx); |
40 | } | 40 | } |
41 | 41 | ||
42 | bool SocFile::IsValid() | 42 | bool SocFile::IsValid() |
@@ -44,9 +44,12 @@ bool SocFile::IsValid() | |||
44 | return m_valid; | 44 | return m_valid; |
45 | } | 45 | } |
46 | 46 | ||
47 | SocRef SocFile::GetSocRef() | 47 | soc_desc::soc_ref_t SocFile::GetSocRef() |
48 | { | 48 | { |
49 | return SocRef(this); | 49 | if(m_valid) |
50 | return soc_desc::soc_ref_t(&m_soc); | ||
51 | else | ||
52 | return soc_desc::soc_ref_t(); | ||
50 | } | 53 | } |
51 | 54 | ||
52 | QString SocFile::GetFilename() | 55 | QString SocFile::GetFilename() |
@@ -67,15 +70,22 @@ QList< SocFileRef > Backend::GetSocFileList() | |||
67 | { | 70 | { |
68 | QList< SocFileRef > list; | 71 | QList< SocFileRef > list; |
69 | for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) | 72 | for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) |
70 | list.append(SocFileRef(&(*it))); | 73 | { |
74 | if(it->IsValid()) | ||
75 | list.append(SocFileRef(&(*it))); | ||
76 | } | ||
71 | return list; | 77 | return list; |
72 | } | 78 | } |
73 | 79 | ||
74 | QList< SocRef > Backend::GetSocList() | 80 | QList< soc_desc::soc_ref_t > Backend::GetSocList() |
75 | { | 81 | { |
76 | QList< SocRef > list; | 82 | QList< soc_desc::soc_ref_t > list; |
77 | for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) | 83 | for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) |
78 | list.append(it->GetSocRef()); | 84 | { |
85 | soc_desc::soc_ref_t r = it->GetSocRef(); | ||
86 | if(r.valid()) | ||
87 | list.append(r); | ||
88 | } | ||
79 | return list; | 89 | return list; |
80 | } | 90 | } |
81 | 91 | ||
@@ -85,7 +95,7 @@ bool Backend::LoadSocDesc(const QString& filename) | |||
85 | if(!f.IsValid()) | 95 | if(!f.IsValid()) |
86 | return false; | 96 | return false; |
87 | m_socs.push_back(f); | 97 | m_socs.push_back(f); |
88 | emit OnSocListChanged(); | 98 | emit OnSocAdded(SocFileRef(&m_socs.back())); |
89 | return true; | 99 | return true; |
90 | } | 100 | } |
91 | 101 | ||
@@ -107,6 +117,63 @@ IoBackend *Backend::CreateHWStubIoBackend(HWStubDevice *dev) | |||
107 | #endif | 117 | #endif |
108 | 118 | ||
109 | /** | 119 | /** |
120 | * DummyIoBackend | ||
121 | */ | ||
122 | |||
123 | DummyIoBackend::DummyIoBackend() | ||
124 | { | ||
125 | } | ||
126 | |||
127 | bool DummyIoBackend::IsValid() | ||
128 | { | ||
129 | return false; | ||
130 | } | ||
131 | |||
132 | QString DummyIoBackend::GetSocName() | ||
133 | { | ||
134 | return ""; | ||
135 | } | ||
136 | |||
137 | bool DummyIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value, | ||
138 | unsigned width) | ||
139 | { | ||
140 | Q_UNUSED(addr); | ||
141 | Q_UNUSED(value); | ||
142 | Q_UNUSED(width); | ||
143 | return false; | ||
144 | } | ||
145 | |||
146 | bool DummyIoBackend::Reload() | ||
147 | { | ||
148 | return false; | ||
149 | } | ||
150 | |||
151 | bool DummyIoBackend::IsReadOnly() | ||
152 | { | ||
153 | return true; | ||
154 | } | ||
155 | |||
156 | bool DummyIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, | ||
157 | unsigned width, WriteMode mode) | ||
158 | { | ||
159 | Q_UNUSED(addr); | ||
160 | Q_UNUSED(value); | ||
161 | Q_UNUSED(mode); | ||
162 | Q_UNUSED(width); | ||
163 | return false; | ||
164 | } | ||
165 | |||
166 | bool DummyIoBackend::IsDirty() | ||
167 | { | ||
168 | return false; | ||
169 | } | ||
170 | |||
171 | bool DummyIoBackend::Commit() | ||
172 | { | ||
173 | return false; | ||
174 | } | ||
175 | |||
176 | /** | ||
110 | * RamIoBackend | 177 | * RamIoBackend |
111 | */ | 178 | */ |
112 | RamIoBackend::RamIoBackend(const QString& soc_name) | 179 | RamIoBackend::RamIoBackend(const QString& soc_name) |
@@ -114,9 +181,36 @@ RamIoBackend::RamIoBackend(const QString& soc_name) | |||
114 | m_soc = soc_name; | 181 | m_soc = soc_name; |
115 | } | 182 | } |
116 | 183 | ||
117 | bool RamIoBackend::ReadRegister(const QString& name, soc_word_t& value) | 184 | bool RamIoBackend::IsValid() |
185 | { | ||
186 | return m_soc != ""; | ||
187 | } | ||
188 | |||
189 | QString RamIoBackend::GetSocName() | ||
190 | { | ||
191 | return m_soc; | ||
192 | } | ||
193 | |||
194 | void RamIoBackend::SetSocName(const QString& soc_name) | ||
195 | { | ||
196 | m_soc = soc_name; | ||
197 | } | ||
198 | |||
199 | bool RamIoBackend::RamIoBackend::Reload() | ||
118 | { | 200 | { |
119 | QMap<QString, soc_word_t>::const_iterator it = m_map.find(name); | 201 | return false; |
202 | } | ||
203 | |||
204 | bool RamIoBackend::IsReadOnly() | ||
205 | { | ||
206 | return false; | ||
207 | } | ||
208 | |||
209 | bool RamIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value, | ||
210 | unsigned width) | ||
211 | { | ||
212 | Q_UNUSED(width); | ||
213 | QMap<soc_addr_t, soc_word_t>::const_iterator it = m_map.find(addr); | ||
120 | if(it == m_map.end()) | 214 | if(it == m_map.end()) |
121 | return false; | 215 | return false; |
122 | value = it.value(); | 216 | value = it.value(); |
@@ -128,19 +222,29 @@ void RamIoBackend::DeleteAll() | |||
128 | m_map.clear(); | 222 | m_map.clear(); |
129 | } | 223 | } |
130 | 224 | ||
131 | bool RamIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) | 225 | bool RamIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, |
226 | unsigned width, WriteMode mode) | ||
132 | { | 227 | { |
228 | Q_UNUSED(width); | ||
133 | switch(mode) | 229 | switch(mode) |
134 | { | 230 | { |
135 | case Write: m_map[name] = value; return true; | 231 | case Write: m_map[addr] = value; return true; |
136 | case Set: m_map[name] |= value; return true; | 232 | case Set: m_map[addr] |= value; return true; |
137 | case Clear: m_map[name] &= ~value; return true; | 233 | case Clear: m_map[addr] &= ~value; return true; |
138 | case Toggle: m_map[name] ^= value; return true; | 234 | case Toggle: m_map[addr] ^= value; return true; |
139 | default: return false; | 235 | default: return false; |
140 | } | 236 | } |
141 | } | 237 | } |
142 | 238 | ||
239 | bool RamIoBackend::IsDirty() | ||
240 | { | ||
241 | return false; | ||
242 | } | ||
143 | 243 | ||
244 | bool RamIoBackend::Commit() | ||
245 | { | ||
246 | return false; | ||
247 | } | ||
144 | 248 | ||
145 | /** | 249 | /** |
146 | * FileIoBackend | 250 | * FileIoBackend |
@@ -154,6 +258,10 @@ FileIoBackend::FileIoBackend(const QString& filename, const QString& soc_name) | |||
154 | Reload(); | 258 | Reload(); |
155 | } | 259 | } |
156 | 260 | ||
261 | bool FileIoBackend::IsValid() | ||
262 | { | ||
263 | return m_valid; | ||
264 | } | ||
157 | 265 | ||
158 | bool FileIoBackend::Reload() | 266 | bool FileIoBackend::Reload() |
159 | { | 267 | { |
@@ -170,25 +278,27 @@ bool FileIoBackend::Reload() | |||
170 | int idx = line.indexOf('='); | 278 | int idx = line.indexOf('='); |
171 | if(idx == -1) | 279 | if(idx == -1) |
172 | continue; | 280 | continue; |
173 | QString key = line.left(idx).trimmed(); | 281 | QString key_str = line.left(idx).trimmed(); |
174 | bool ok; | 282 | QString val_str = line.mid(idx + 1).trimmed(); |
175 | soc_word_t val = line.mid(idx + 1).trimmed().toULong(&ok, 0); | 283 | bool key_ok,val_ok; |
176 | if(key == "HW") | 284 | soc_word_t val = val_str.toULong(&val_ok, 0); |
177 | m_soc = line.mid(idx + 1).trimmed(); | 285 | soc_word_t key = key_str.toULong(&key_ok, 0); |
178 | else if(ok) | 286 | if(key_str == "soc") |
179 | RamIoBackend::WriteRegister(key, val, Write); | 287 | m_soc = val_str; |
288 | else if(key_ok && val_ok) | ||
289 | RamIoBackend::WriteRegister(key, val, 32, Write); | ||
180 | } | 290 | } |
181 | |||
182 | m_readonly = !QFileInfo(file).isWritable(); | 291 | m_readonly = !QFileInfo(file).isWritable(); |
183 | m_dirty = false; | 292 | m_dirty = false; |
184 | m_valid = true; | 293 | m_valid = true; |
185 | return true; | 294 | return true; |
186 | } | 295 | } |
187 | 296 | ||
188 | bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) | 297 | bool FileIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, |
298 | unsigned width, WriteMode mode) | ||
189 | { | 299 | { |
190 | m_dirty = true; | 300 | m_dirty = true; |
191 | return RamIoBackend::WriteRegister(name, value, mode); | 301 | return RamIoBackend::WriteRegister(addr, value, width, mode); |
192 | } | 302 | } |
193 | 303 | ||
194 | bool FileIoBackend::Commit() | 304 | bool FileIoBackend::Commit() |
@@ -199,17 +309,32 @@ bool FileIoBackend::Commit() | |||
199 | if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) | 309 | if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) |
200 | return false; | 310 | return false; |
201 | QTextStream out(&file); | 311 | QTextStream out(&file); |
202 | out << "HW = " << m_soc << "\n"; | 312 | out << "soc = " << m_soc << "\n"; |
203 | QMapIterator< QString, soc_word_t > it(m_map); | 313 | QMapIterator< soc_addr_t, soc_word_t > it(m_map); |
204 | while(it.hasNext()) | 314 | while(it.hasNext()) |
205 | { | 315 | { |
206 | it.next(); | 316 | it.next(); |
207 | out << it.key() << " = " << hex << showbase << it.value() << "\n"; | 317 | out << hex << showbase << it.key() << " = " << hex << showbase << it.value() << "\n"; |
208 | } | 318 | } |
209 | out.flush(); | 319 | out.flush(); |
210 | return file.flush(); | 320 | return file.flush(); |
211 | } | 321 | } |
212 | 322 | ||
323 | bool FileIoBackend::IsReadOnly() | ||
324 | { | ||
325 | return m_readonly; | ||
326 | } | ||
327 | |||
328 | bool FileIoBackend::IsDirty() | ||
329 | { | ||
330 | return m_dirty; | ||
331 | } | ||
332 | |||
333 | QString FileIoBackend::GetFileName() | ||
334 | { | ||
335 | return m_filename; | ||
336 | } | ||
337 | |||
213 | #ifdef HAVE_HWSTUB | 338 | #ifdef HAVE_HWSTUB |
214 | /** | 339 | /** |
215 | * HWStubDevice | 340 | * HWStubDevice |
@@ -355,6 +480,8 @@ HWStubIoBackend::HWStubIoBackend(HWStubDevice *dev) | |||
355 | else | 480 | else |
356 | m_soc = QString("pp%1").arg(pp.wChipID, 4, 16, QChar('0')); | 481 | m_soc = QString("pp%1").arg(pp.wChipID, 4, 16, QChar('0')); |
357 | } | 482 | } |
483 | else if(target.dID == HWSTUB_TARGET_ATJ) | ||
484 | m_soc = "atj213x"; | ||
358 | else | 485 | else |
359 | m_soc = target.bName; | 486 | m_soc = target.bName; |
360 | } | 487 | } |
@@ -369,13 +496,44 @@ HWStubIoBackend::~HWStubIoBackend() | |||
369 | delete m_dev; | 496 | delete m_dev; |
370 | } | 497 | } |
371 | 498 | ||
372 | bool HWStubIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value) | 499 | bool HWStubIoBackend::IsValid() |
500 | { | ||
501 | return m_dev->IsValid(); | ||
502 | } | ||
503 | |||
504 | bool HWStubIoBackend::IsReadOnly() | ||
505 | { | ||
506 | return false; | ||
507 | } | ||
508 | |||
509 | bool HWStubIoBackend::IsDirty() | ||
373 | { | 510 | { |
374 | return m_dev->ReadMem(addr, sizeof(value), &value); | 511 | return false; |
375 | } | 512 | } |
376 | 513 | ||
377 | bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) | 514 | bool HWStubIoBackend::Commit() |
378 | { | 515 | { |
516 | return true; | ||
517 | } | ||
518 | |||
519 | HWStubDevice *HWStubIoBackend::GetDevice() | ||
520 | { | ||
521 | return m_dev; | ||
522 | } | ||
523 | |||
524 | bool HWStubIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value, | ||
525 | unsigned width) | ||
526 | { | ||
527 | if(width != 8 && width != 16 && width != 32) | ||
528 | return false; | ||
529 | return m_dev->ReadMem(addr, width / 8, &value); | ||
530 | } | ||
531 | |||
532 | bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, | ||
533 | unsigned width, WriteMode mode) | ||
534 | { | ||
535 | if(width != 8 && width != 16 && width != 32) | ||
536 | return false; | ||
379 | switch(mode) | 537 | switch(mode) |
380 | { | 538 | { |
381 | case Set: addr += 4; break; | 539 | case Set: addr += 4; break; |
@@ -383,7 +541,7 @@ bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode | |||
383 | case Toggle: addr += 12; break; | 541 | case Toggle: addr += 12; break; |
384 | default: break; | 542 | default: break; |
385 | } | 543 | } |
386 | return m_dev->WriteMem(addr, sizeof(value), &value); | 544 | return m_dev->WriteMem(addr, width / 8, &value); |
387 | } | 545 | } |
388 | 546 | ||
389 | bool HWStubIoBackend::Reload() | 547 | bool HWStubIoBackend::Reload() |
@@ -486,146 +644,146 @@ lib_usb_init __lib_usb_init; | |||
486 | * BackendHelper | 644 | * BackendHelper |
487 | */ | 645 | */ |
488 | 646 | ||
489 | BackendHelper::BackendHelper(IoBackend *io_backend, const SocRef& soc) | 647 | BackendHelper::BackendHelper(IoBackend *io_backend, const soc_desc::soc_ref_t& soc) |
490 | :m_io_backend(io_backend), m_soc(soc) | 648 | :m_io_backend(io_backend), m_soc(soc) |
491 | { | 649 | { |
492 | } | 650 | } |
493 | 651 | ||
494 | bool BackendHelper::ReadRegister(const QString& dev, const QString& reg, soc_word_t& v) | 652 | QString BackendHelper::GetPath(const soc_desc::node_inst_t& inst) |
495 | { | 653 | { |
496 | if(m_io_backend->SupportAccess(IoBackend::ByName)) | 654 | if(!inst.valid() || inst.is_root()) |
497 | return m_io_backend->ReadRegister("HW." + dev + "." + reg, v); | 655 | return QString(); |
498 | if(m_io_backend->SupportAccess(IoBackend::ByAddress)) | 656 | QString s = GetPath(inst.parent()); |
499 | { | 657 | if(!s.isEmpty()) |
500 | soc_addr_t addr; | 658 | s += "."; |
501 | if(GetRegisterAddress(dev, reg, addr)) | 659 | s += inst.name().c_str(); |
502 | return m_io_backend->ReadRegister(addr, v); | 660 | if(inst.is_indexed()) |
503 | } | 661 | s = QString("%1[%2]").arg(s).arg(inst.index()); |
504 | return false; | 662 | return s; |
505 | } | ||
506 | |||
507 | bool BackendHelper::WriteRegister(const QString& dev, const QString& reg, | ||
508 | soc_word_t v, IoBackend::WriteMode mode) | ||
509 | { | ||
510 | if(m_io_backend->SupportAccess(IoBackend::ByName)) | ||
511 | return m_io_backend->WriteRegister("HW." + dev + "." + reg, v, mode); | ||
512 | if(m_io_backend->SupportAccess(IoBackend::ByAddress)) | ||
513 | { | ||
514 | soc_addr_t addr; | ||
515 | if(GetRegisterAddress(dev, reg, addr)) | ||
516 | return m_io_backend->WriteRegister(addr, v, mode); | ||
517 | } | ||
518 | return false; | ||
519 | } | 663 | } |
520 | 664 | ||
521 | bool BackendHelper::GetDevRef(const QString& sdev, SocDevRef& ref) | 665 | soc_desc::node_inst_t BackendHelper::ParsePath(const QString& path) |
522 | { | 666 | { |
523 | for(size_t i = 0; i < m_soc.GetSoc().dev.size(); i++) | 667 | soc_desc::node_inst_t inst = m_soc.root_inst(); |
668 | /* empty path is root */ | ||
669 | if(path.isEmpty()) | ||
670 | return inst; | ||
671 | int pos = 0; | ||
672 | while(pos < path.size()) | ||
524 | { | 673 | { |
525 | const soc_dev_t& dev = m_soc.GetSoc().dev[i]; | 674 | /* try to find the next separator */ |
526 | for(size_t j = 0; j < dev.addr.size(); j++) | 675 | int next = path.indexOf('.', pos); |
527 | if(dev.addr[j].name.c_str() == sdev) | 676 | if(next == -1) |
528 | { | 677 | next = path.size(); |
529 | ref = SocDevRef(m_soc, i, j); | 678 | /* try to find the index, if any */ |
530 | return true; | 679 | int lidx = path.indexOf('[', pos); |
531 | } | 680 | if(lidx == -1 || lidx > next) |
681 | lidx = next; | ||
682 | /* extract name */ | ||
683 | std::string name = path.mid(pos, lidx - pos).toStdString(); | ||
684 | /* and index */ | ||
685 | if(lidx < next) | ||
686 | { | ||
687 | int ridx = path.indexOf(']', lidx + 1); | ||
688 | /* syntax error ? */ | ||
689 | if(ridx == -1 || ridx > next) | ||
690 | return soc_desc::node_inst_t(); | ||
691 | /* invalid number ? */ | ||
692 | bool ok = false; | ||
693 | size_t idx = path.mid(lidx + 1, ridx - lidx - 1).toUInt(&ok); | ||
694 | if(ok) | ||
695 | inst = inst.child(name, idx); | ||
696 | else | ||
697 | inst = soc_desc::node_inst_t(); | ||
698 | } | ||
699 | else | ||
700 | inst = inst.child(name); | ||
701 | /* advance right after the separator */ | ||
702 | pos = next + 1; | ||
532 | } | 703 | } |
533 | return false; | 704 | return inst; |
534 | } | 705 | } |
535 | 706 | ||
536 | bool BackendHelper::GetRegRef(const SocDevRef& dev, const QString& sreg, SocRegRef& ref) | 707 | bool BackendHelper::ReadRegister(const soc_desc::node_inst_t& inst, |
708 | soc_word_t& v) | ||
537 | { | 709 | { |
538 | const soc_dev_t& sdev = dev.GetDev(); | 710 | soc_addr_t addr; |
539 | for(size_t i = 0; i < sdev.reg.size(); i++) | 711 | if(!GetRegisterAddress(inst, addr)) |
540 | { | 712 | return false; |
541 | const soc_reg_t& reg = sdev.reg[i]; | 713 | return m_io_backend->ReadRegister(addr, v, inst.node().reg().get()->width); |
542 | for(size_t j = 0; j < reg.addr.size(); j++) | ||
543 | { | ||
544 | if(reg.addr[j].name.c_str() == sreg) | ||
545 | { | ||
546 | ref = SocRegRef(dev, i, j); | ||
547 | return true; | ||
548 | } | ||
549 | } | ||
550 | } | ||
551 | return false; | ||
552 | } | 714 | } |
553 | 715 | ||
554 | bool BackendHelper::GetFieldRef(const SocRegRef& reg, const QString& sfield, SocFieldRef& ref) | 716 | bool BackendHelper::WriteRegister(const soc_desc::node_inst_t& inst, |
717 | soc_word_t v, IoBackend::WriteMode mode) | ||
555 | { | 718 | { |
556 | for(size_t i = 0; i < reg.GetReg().field.size(); i++) | 719 | soc_addr_t addr; |
557 | if(reg.GetReg().field[i].name.c_str() == sfield) | 720 | if(!GetRegisterAddress(inst, addr)) |
558 | { | 721 | return false; |
559 | ref = SocFieldRef(reg, i); | 722 | return m_io_backend->WriteRegister(addr, v, inst.node().reg().get()->width, mode); |
560 | return true; | ||
561 | } | ||
562 | return false; | ||
563 | } | 723 | } |
564 | 724 | ||
565 | bool BackendHelper::GetRegisterAddress(const QString& dev, const QString& reg, | 725 | bool BackendHelper::GetRegisterAddress(const soc_desc::node_inst_t& inst, |
566 | soc_addr_t& addr) | 726 | soc_addr_t& addr) |
567 | { | 727 | { |
568 | SocDevRef dev_ref; | 728 | if(!inst.valid()) |
569 | SocRegRef reg_ref; | ||
570 | if(!GetDevRef(dev, dev_ref) || !GetRegRef(dev_ref, reg, reg_ref)) | ||
571 | return false; | 729 | return false; |
572 | addr = dev_ref.GetDevAddr().addr + reg_ref.GetRegAddr().addr; | 730 | addr = inst.addr(); |
573 | return true; | 731 | return true; |
574 | } | 732 | } |
575 | 733 | ||
576 | bool BackendHelper::ReadRegisterField(const QString& dev, const QString& reg, | 734 | bool BackendHelper::ReadRegisterField(const soc_desc::node_inst_t& inst, |
577 | const QString& field, soc_word_t& v) | 735 | const QString& field, soc_word_t& v) |
578 | { | 736 | { |
579 | SocDevRef dev_ref; | 737 | soc_desc::field_ref_t ref = inst.node().reg().field(field.toStdString()); |
580 | SocRegRef reg_ref; | 738 | if(!ref.valid()) |
581 | SocFieldRef field_ref; | ||
582 | if(!GetDevRef(dev, dev_ref) || !GetRegRef(dev_ref, reg, reg_ref) || | ||
583 | !GetFieldRef(reg_ref, field, field_ref)) | ||
584 | return false; | 739 | return false; |
585 | if(!ReadRegister(dev, reg, v)) | 740 | if(!ReadRegister(inst, v)) |
586 | return false; | 741 | return false; |
587 | v = (v & field_ref.GetField().bitmask()) >> field_ref.GetField().first_bit; | 742 | v = (v & ref.get()->bitmask()) >> ref.get()->pos; |
588 | return true; | 743 | return true; |
589 | } | 744 | } |
590 | 745 | ||
591 | bool BackendHelper::DumpAllRegisters(const QString& filename, bool ignore_errors) | 746 | bool BackendHelper::DumpAllRegisters(const QString& filename, bool ignore_errors) |
592 | { | 747 | { |
593 | FileIoBackend b(filename, QString::fromStdString(m_soc.GetSoc().name)); | 748 | FileIoBackend b(filename, QString::fromStdString(m_soc.get()->name)); |
594 | bool ret = DumpAllRegisters(&b, ignore_errors); | 749 | bool ret = DumpAllRegisters(&b, ignore_errors); |
595 | return ret && b.Commit(); | 750 | return ret && b.Commit(); |
596 | } | 751 | } |
597 | 752 | ||
598 | bool BackendHelper::DumpAllRegisters(IoBackend *backend, bool ignore_errors) | 753 | bool BackendHelper::DumpAllRegisters(IoBackend *backend, bool ignore_errors) |
599 | { | 754 | { |
600 | BackendHelper bh(backend, m_soc); | 755 | BackendHelper helper(backend, m_soc); |
756 | return DumpAllRegisters(&helper, m_soc.root_inst(), ignore_errors); | ||
757 | } | ||
758 | |||
759 | bool BackendHelper::DumpAllRegisters(BackendHelper *bh, | ||
760 | const soc_desc::node_inst_t& inst, bool ignore_errors) | ||
761 | { | ||
601 | bool ret = true; | 762 | bool ret = true; |
602 | for(size_t i = 0; i < m_soc.GetSoc().dev.size(); i++) | 763 | if(inst.node().reg().valid()) |
764 | { | ||
765 | soc_word_t val; | ||
766 | if(!ReadRegister(inst, val)) | ||
767 | { | ||
768 | ret = false; | ||
769 | if(!ignore_errors) | ||
770 | return false; | ||
771 | } | ||
772 | else if(!bh->WriteRegister(inst, val)) | ||
773 | { | ||
774 | ret = false; | ||
775 | if(!ignore_errors) | ||
776 | return false; | ||
777 | } | ||
778 | } | ||
779 | std::vector< soc_desc::node_inst_t > list = inst.children(); | ||
780 | for(size_t i = 0; i < list.size(); i++) | ||
603 | { | 781 | { |
604 | const soc_dev_t& dev = m_soc.GetSoc().dev[i]; | 782 | if(!DumpAllRegisters(bh, list[i], ignore_errors)) |
605 | for(size_t j = 0; j < dev.addr.size(); j++) | ||
606 | { | 783 | { |
607 | QString devname = QString::fromStdString(dev.addr[j].name); | 784 | ret = false; |
608 | for(size_t k = 0; k < dev.reg.size(); k++) | 785 | if(!ignore_errors) |
609 | { | 786 | return false; |
610 | const soc_reg_t& reg = dev.reg[k]; | ||
611 | for(size_t l = 0; l < reg.addr.size(); l++) | ||
612 | { | ||
613 | QString regname = QString::fromStdString(reg.addr[l].name); | ||
614 | soc_word_t val; | ||
615 | if(!ReadRegister(devname, regname, val)) | ||
616 | { | ||
617 | ret = false; | ||
618 | if(!ignore_errors) | ||
619 | return false; | ||
620 | } | ||
621 | else if(!bh.WriteRegister(devname, regname, val)) | ||
622 | { | ||
623 | ret = false; | ||
624 | if(!ignore_errors) | ||
625 | return false; | ||
626 | } | ||
627 | } | ||
628 | } | ||
629 | } | 787 | } |
630 | } | 788 | } |
631 | return ret; | 789 | return ret; |
diff --git a/utils/regtools/qeditor/backend.h b/utils/regtools/qeditor/backend.h index 934c1c359b..17eeb44533 100644 --- a/utils/regtools/qeditor/backend.h +++ b/utils/regtools/qeditor/backend.h | |||
@@ -26,14 +26,17 @@ | |||
26 | #include <QMap> | 26 | #include <QMap> |
27 | #include <QVector> | 27 | #include <QVector> |
28 | #include <QMetaType> | 28 | #include <QMetaType> |
29 | #include <QAbstractItemModel> | ||
29 | #ifdef HAVE_HWSTUB | 30 | #ifdef HAVE_HWSTUB |
30 | #include "hwstub.h" | 31 | #include "hwstub.h" |
31 | #endif | 32 | #endif |
32 | #include "soc_desc_v1.hpp" | 33 | #include "soc_desc.hpp" |
33 | 34 | ||
34 | /* we don't want to import the entire soc_desc except for a few selected | 35 | /* we don't want to import the entire soc_desc except for a few selected |
35 | * pieces */ | 36 | * pieces */ |
36 | using namespace soc_desc_v1; | 37 | using soc_desc::soc_word_t; |
38 | using soc_desc::soc_addr_t; | ||
39 | using soc_desc::soc_id_t; | ||
37 | 40 | ||
38 | class IoBackend : public QObject | 41 | class IoBackend : public QObject |
39 | { | 42 | { |
@@ -47,35 +50,20 @@ public: | |||
47 | Write, Set, Clear, Toggle | 50 | Write, Set, Clear, Toggle |
48 | }; | 51 | }; |
49 | 52 | ||
50 | enum AccessType | ||
51 | { | ||
52 | ByName, | ||
53 | ByAddress, | ||
54 | }; | ||
55 | |||
56 | /** Register naming convention: name based access are of the form: | ||
57 | * HW.dev.reg | ||
58 | * where <dev> is the device name (including index like APPUART1) | ||
59 | * and <reg> is the register name (including index like PRIORITY29) */ | ||
60 | /* report whether backend is valid */ | 53 | /* report whether backend is valid */ |
61 | virtual bool IsValid() = 0; | 54 | virtual bool IsValid() = 0; |
62 | /* report whether backend supports register access type */ | ||
63 | virtual bool SupportAccess(AccessType type) = 0; | ||
64 | /* get SoC name */ | 55 | /* get SoC name */ |
65 | virtual QString GetSocName() = 0; | 56 | virtual QString GetSocName() = 0; |
66 | /* read a register by name or address */ | 57 | /* read a register */ |
67 | virtual bool ReadRegister(const QString& name, soc_word_t& value) = 0; | 58 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width) = 0; |
68 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) = 0; | ||
69 | /* reload content (if it makes sense) */ | 59 | /* reload content (if it makes sense) */ |
70 | virtual bool Reload() = 0; | 60 | virtual bool Reload() = 0; |
71 | /* check whether backend supports writing */ | 61 | /* check whether backend supports writing */ |
72 | virtual bool IsReadOnly() = 0; | 62 | virtual bool IsReadOnly() = 0; |
73 | /* write a register by name or address | 63 | /* write a register by name or address |
74 | * NOTE: even on a read-only backend, a write is allowed be successful as long | 64 | * NOTE: even on a read-only backend, a write is allowed to be successful as long |
75 | * as commit fails */ | 65 | * as commit fails */ |
76 | virtual bool WriteRegister(const QString& name, soc_word_t value, | 66 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
77 | WriteMode mode = Write) = 0; | ||
78 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, | ||
79 | WriteMode mode = Write) = 0; | 67 | WriteMode mode = Write) = 0; |
80 | /* check whether backend contains uncommitted (ie cached) writes */ | 68 | /* check whether backend contains uncommitted (ie cached) writes */ |
81 | virtual bool IsDirty() = 0; | 69 | virtual bool IsDirty() = 0; |
@@ -87,23 +75,17 @@ class DummyIoBackend : public IoBackend | |||
87 | { | 75 | { |
88 | Q_OBJECT | 76 | Q_OBJECT |
89 | public: | 77 | public: |
90 | DummyIoBackend() {} | 78 | DummyIoBackend(); |
91 | 79 | ||
92 | virtual bool IsValid() { return false; } | 80 | virtual bool IsValid(); |
93 | virtual bool SupportAccess(AccessType type) { Q_UNUSED(type); return false; } | 81 | virtual QString GetSocName(); |
94 | virtual QString GetSocName() { return ""; } | 82 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width); |
95 | virtual bool ReadRegister(const QString& name, soc_word_t& value) | 83 | virtual bool Reload(); |
96 | { Q_UNUSED(name); Q_UNUSED(value); return false; } | 84 | virtual bool IsReadOnly(); |
97 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) | 85 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
98 | { Q_UNUSED(addr); Q_UNUSED(value); return false; } | 86 | WriteMode mode); |
99 | virtual bool Reload() { return false; } | 87 | virtual bool IsDirty(); |
100 | virtual bool IsReadOnly() { return true; } | 88 | virtual bool Commit(); |
101 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode) | ||
102 | { Q_UNUSED(name); Q_UNUSED(value); Q_UNUSED(mode); return false; } | ||
103 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) | ||
104 | { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; } | ||
105 | virtual bool IsDirty() { return false; } | ||
106 | virtual bool Commit() { return false; } | ||
107 | }; | 89 | }; |
108 | 90 | ||
109 | /** The RAM backend doesn't have any backend storage and stores all values in | 91 | /** The RAM backend doesn't have any backend storage and stores all values in |
@@ -114,26 +96,22 @@ class RamIoBackend : public IoBackend | |||
114 | public: | 96 | public: |
115 | RamIoBackend(const QString& soc_name = ""); | 97 | RamIoBackend(const QString& soc_name = ""); |
116 | 98 | ||
117 | virtual bool IsValid() { return m_soc != ""; } | 99 | virtual bool IsValid(); |
118 | virtual bool SupportAccess(AccessType type) { return type == ByName; } | 100 | virtual QString GetSocName(); |
119 | virtual QString GetSocName() { return m_soc; } | 101 | virtual void SetSocName(const QString& soc_name); |
120 | virtual void SetSocName(const QString& soc_name) { m_soc = soc_name; } | 102 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width); |
121 | virtual bool ReadRegister(const QString& name, soc_word_t& value); | 103 | virtual bool Reload(); |
122 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) | 104 | virtual bool IsReadOnly(); |
123 | { Q_UNUSED(addr); Q_UNUSED(value); return false; } | 105 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
124 | virtual bool Reload() { return false; } | 106 | WriteMode mode); |
125 | virtual bool IsReadOnly() { return false; } | 107 | virtual bool IsDirty(); |
126 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); | 108 | virtual bool Commit(); |
127 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) | ||
128 | { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; } | ||
129 | virtual bool IsDirty() { return false; } | ||
130 | virtual bool Commit() { return false; } | ||
131 | /* clear all entries of the backend */ | 109 | /* clear all entries of the backend */ |
132 | virtual void DeleteAll(); | 110 | virtual void DeleteAll(); |
133 | 111 | ||
134 | protected: | 112 | protected: |
135 | QString m_soc; | 113 | QString m_soc; |
136 | QMap< QString, soc_word_t > m_map; | 114 | QMap< soc_addr_t, soc_word_t > m_map; |
137 | }; | 115 | }; |
138 | 116 | ||
139 | /** NOTE the File backend makes a difference between writes and commits: | 117 | /** NOTE the File backend makes a difference between writes and commits: |
@@ -144,14 +122,14 @@ class FileIoBackend : public RamIoBackend | |||
144 | public: | 122 | public: |
145 | FileIoBackend(const QString& filename, const QString& soc_name = ""); | 123 | FileIoBackend(const QString& filename, const QString& soc_name = ""); |
146 | 124 | ||
147 | virtual bool IsValid() { return m_valid; } | 125 | virtual bool IsValid(); |
148 | virtual bool SupportAccess(AccessType type) { return type == ByName; } | ||
149 | virtual bool Reload(); | 126 | virtual bool Reload(); |
150 | virtual bool IsReadOnly() { return m_readonly; } | 127 | virtual bool IsReadOnly(); |
151 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); | 128 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
152 | virtual bool IsDirty() { return m_dirty; } | 129 | WriteMode mode); |
130 | virtual bool IsDirty(); | ||
153 | virtual bool Commit(); | 131 | virtual bool Commit(); |
154 | QString GetFileName() { return m_filename; } | 132 | QString GetFileName(); |
155 | 133 | ||
156 | protected: | 134 | protected: |
157 | QString m_filename; | 135 | QString m_filename; |
@@ -204,20 +182,16 @@ public: | |||
204 | HWStubIoBackend(HWStubDevice *dev); | 182 | HWStubIoBackend(HWStubDevice *dev); |
205 | virtual ~HWStubIoBackend(); | 183 | virtual ~HWStubIoBackend(); |
206 | 184 | ||
207 | virtual bool IsValid() { return m_dev->IsValid(); } | 185 | virtual bool IsValid(); |
208 | virtual bool SupportAccess(AccessType type) { return type == ByAddress; } | ||
209 | virtual QString GetSocName(); | 186 | virtual QString GetSocName(); |
210 | virtual bool ReadRegister(const QString& name, soc_word_t& value) | 187 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width); |
211 | { Q_UNUSED(name); Q_UNUSED(value); return false; } | ||
212 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value); | ||
213 | virtual bool Reload(); | 188 | virtual bool Reload(); |
214 | virtual bool IsReadOnly() { return false; } | 189 | virtual bool IsReadOnly(); |
215 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode) | 190 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
216 | { Q_UNUSED(name); Q_UNUSED(value); Q_UNUSED(mode); return false; } | 191 | WriteMode mode); |
217 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode); | 192 | virtual bool IsDirty(); |
218 | virtual bool IsDirty() { return false; } | 193 | virtual bool Commit(); |
219 | virtual bool Commit() { return true; } | 194 | HWStubDevice *GetDevice(); |
220 | HWStubDevice *GetDevice() { return m_dev; } | ||
221 | 195 | ||
222 | protected: | 196 | protected: |
223 | QString m_soc; | 197 | QString m_soc; |
@@ -251,8 +225,6 @@ protected: | |||
251 | }; | 225 | }; |
252 | #endif | 226 | #endif |
253 | 227 | ||
254 | class SocRef; | ||
255 | |||
256 | class SocFile | 228 | class SocFile |
257 | { | 229 | { |
258 | public: | 230 | public: |
@@ -260,14 +232,14 @@ public: | |||
260 | SocFile(const QString& filename); | 232 | SocFile(const QString& filename); |
261 | bool IsValid(); | 233 | bool IsValid(); |
262 | 234 | ||
263 | SocRef GetSocRef(); | 235 | soc_desc::soc_ref_t GetSocRef(); |
264 | QString GetFilename(); | 236 | QString GetFilename(); |
265 | soc_t& GetSoc() { return m_soc; } | 237 | soc_desc::soc_t& GetSoc() { return m_soc; } |
266 | 238 | ||
267 | protected: | 239 | protected: |
268 | bool m_valid; | 240 | bool m_valid; |
269 | QString m_filename; | 241 | QString m_filename; |
270 | soc_t m_soc; | 242 | soc_desc::soc_t m_soc; |
271 | }; | 243 | }; |
272 | 244 | ||
273 | class SocFileRef | 245 | class SocFileRef |
@@ -283,56 +255,17 @@ protected: | |||
283 | 255 | ||
284 | Q_DECLARE_METATYPE(SocFileRef) | 256 | Q_DECLARE_METATYPE(SocFileRef) |
285 | 257 | ||
286 | class SocRef : public SocFileRef | 258 | Q_DECLARE_METATYPE(soc_desc::instance_t::type_t) |
287 | { | 259 | Q_DECLARE_METATYPE(soc_desc::range_t::type_t) |
288 | public: | ||
289 | SocRef() {} | ||
290 | SocRef(SocFile *file):SocFileRef(file) {} | ||
291 | soc_t& GetSoc() const { return GetSocFile()->GetSoc(); } | ||
292 | }; | ||
293 | |||
294 | Q_DECLARE_METATYPE(SocRef) | ||
295 | 260 | ||
296 | class SocDevRef : public SocRef | 261 | Q_DECLARE_METATYPE(soc_desc::soc_ref_t) |
297 | { | 262 | Q_DECLARE_METATYPE(soc_desc::node_ref_t) |
298 | public: | 263 | Q_DECLARE_METATYPE(soc_desc::register_ref_t) |
299 | SocDevRef() {} | 264 | Q_DECLARE_METATYPE(soc_desc::field_ref_t) |
300 | SocDevRef(const SocRef& soc, int dev_idx, int dev_addr_idx) | 265 | Q_DECLARE_METATYPE(soc_desc::node_inst_t) |
301 | :SocRef(soc), m_dev_idx(dev_idx), m_dev_addr_idx(dev_addr_idx) {} | ||
302 | int GetDevIndex() const { return m_dev_idx; } | ||
303 | soc_dev_t& GetDev() const { return GetSoc().dev[GetDevIndex()]; } | ||
304 | int GetDevAddrIndex() const { return m_dev_addr_idx; } | ||
305 | soc_dev_addr_t& GetDevAddr() const { return GetDev().addr[GetDevAddrIndex()]; } | ||
306 | protected: | ||
307 | int m_dev_idx, m_dev_addr_idx; | ||
308 | }; | ||
309 | |||
310 | class SocRegRef : public SocDevRef | ||
311 | { | ||
312 | public: | ||
313 | SocRegRef() {} | ||
314 | SocRegRef(const SocDevRef& dev, int reg_idx, int reg_addr_idx) | ||
315 | :SocDevRef(dev), m_reg_idx(reg_idx), m_reg_addr_idx(reg_addr_idx) {} | ||
316 | int GetRegIndex() const { return m_reg_idx; } | ||
317 | soc_reg_t& GetReg() const { return GetDev().reg[GetRegIndex()]; } | ||
318 | int GetRegAddrIndex() const { return m_reg_addr_idx; } | ||
319 | soc_reg_addr_t& GetRegAddr() const { return GetReg().addr[GetRegAddrIndex()]; } | ||
320 | protected: | ||
321 | int m_reg_idx, m_reg_addr_idx; | ||
322 | }; | ||
323 | |||
324 | class SocFieldRef : public SocRegRef | ||
325 | { | ||
326 | public: | ||
327 | SocFieldRef(){} | ||
328 | SocFieldRef(const SocRegRef& reg, int field_idx) | ||
329 | :SocRegRef(reg), m_field_idx(field_idx) {} | ||
330 | int GetFieldIndex() const { return m_field_idx; } | ||
331 | soc_reg_field_t& GetField() const { return GetReg().field[GetFieldIndex()]; } | ||
332 | protected: | ||
333 | int m_field_idx; | ||
334 | }; | ||
335 | 266 | ||
267 | /** NOTE the Backend stores soc descriptions in a way that pointers are never | ||
268 | * invalidated */ | ||
336 | class Backend : public QObject | 269 | class Backend : public QObject |
337 | { | 270 | { |
338 | Q_OBJECT | 271 | Q_OBJECT |
@@ -340,7 +273,7 @@ public: | |||
340 | Backend(); | 273 | Backend(); |
341 | 274 | ||
342 | QList< SocFileRef > GetSocFileList(); | 275 | QList< SocFileRef > GetSocFileList(); |
343 | QList< SocRef > GetSocList(); | 276 | QList< soc_desc::soc_ref_t > GetSocList(); |
344 | bool LoadSocDesc(const QString& filename); | 277 | bool LoadSocDesc(const QString& filename); |
345 | IoBackend *CreateDummyIoBackend(); | 278 | IoBackend *CreateDummyIoBackend(); |
346 | IoBackend *CreateFileIoBackend(const QString& filename); | 279 | IoBackend *CreateFileIoBackend(const QString& filename); |
@@ -349,33 +282,38 @@ public: | |||
349 | #endif | 282 | #endif |
350 | 283 | ||
351 | signals: | 284 | signals: |
352 | void OnSocListChanged(); | 285 | void OnSocAdded(const SocFileRef& ref); |
286 | |||
353 | private: | 287 | private: |
288 | /* store them as a list so that pointers are never invalidated */ | ||
354 | std::list< SocFile > m_socs; | 289 | std::list< SocFile > m_socs; |
355 | }; | 290 | }; |
356 | 291 | ||
357 | class BackendHelper | 292 | class BackendHelper |
358 | { | 293 | { |
359 | public: | 294 | public: |
360 | BackendHelper(IoBackend *io_backend, const SocRef& soc); | 295 | BackendHelper(IoBackend *io_backend, const soc_desc::soc_ref_t& soc); |
361 | bool ReadRegister(const QString& dev, const QString& reg, soc_word_t& v); | 296 | QString GetPath(const soc_desc::node_inst_t& inst); |
362 | bool ReadRegisterField(const QString& dev, const QString& reg, | 297 | soc_desc::node_inst_t ParsePath(const QString& path); |
298 | bool ReadRegister(const soc_desc::node_inst_t& inst, soc_word_t& v); | ||
299 | bool ReadRegisterField(const soc_desc::node_inst_t& inst, | ||
363 | const QString& field, soc_word_t& v); | 300 | const QString& field, soc_word_t& v); |
364 | bool WriteRegister(const QString& dev, const QString& reg, soc_word_t v, | 301 | bool WriteRegister(const soc_desc::node_inst_t& inst, soc_word_t v, |
365 | IoBackend::WriteMode mode = IoBackend::Write); | 302 | IoBackend::WriteMode mode = IoBackend::Write); |
366 | bool GetDevRef(const QString& dev, SocDevRef& ref); | 303 | bool GetRegisterAddress(const soc_desc::node_inst_t& inst, soc_addr_t& addr); |
367 | bool GetRegRef(const SocDevRef& dev, const QString& reg, SocRegRef& ref); | ||
368 | bool GetFieldRef(const SocRegRef& reg, const QString& field, SocFieldRef& ref); | ||
369 | bool GetRegisterAddress(const QString& dev, const QString& reg, soc_addr_t& addr); | ||
370 | /* NOTE: does not commit writes to the backend | 304 | /* NOTE: does not commit writes to the backend |
371 | * if ignore_errors is true, the dump will continue even on errors, and the | 305 | * if ignore_errors is true, the dump will continue even on errors, and the |
372 | * function will return false if one or more errors occured */ | 306 | * function will return false if one or more errors occured */ |
373 | bool DumpAllRegisters(IoBackend *backend, bool ignore_errors = true); | 307 | bool DumpAllRegisters(IoBackend *backend, bool ignore_errors = true); |
374 | bool DumpAllRegisters(const QString& filename, bool ignore_errors = true); | 308 | bool DumpAllRegisters(const QString& filename, bool ignore_errors = true); |
375 | 309 | ||
310 | protected: | ||
311 | bool DumpAllRegisters(BackendHelper *bh, const soc_desc::node_inst_t& inst, | ||
312 | bool ignore_errors); | ||
313 | |||
376 | private: | 314 | private: |
377 | IoBackend *m_io_backend; | 315 | IoBackend *m_io_backend; |
378 | const SocRef& m_soc; | 316 | const soc_desc::soc_ref_t& m_soc; |
379 | }; | 317 | }; |
380 | 318 | ||
381 | #endif /* __BACKEND_H__ */ | 319 | #endif /* __BACKEND_H__ */ |
diff --git a/utils/regtools/qeditor/main.cpp b/utils/regtools/qeditor/main.cpp index d62047e2bb..86a8b96763 100644 --- a/utils/regtools/qeditor/main.cpp +++ b/utils/regtools/qeditor/main.cpp | |||
@@ -20,12 +20,22 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include <QApplication> | 21 | #include <QApplication> |
22 | #include <QDir> | 22 | #include <QDir> |
23 | #include <QTextCodec> | ||
23 | #include "mainwindow.h" | 24 | #include "mainwindow.h" |
24 | 25 | ||
25 | int main(int argc, char *argv[]) | 26 | int main(int argc, char *argv[]) |
26 | { | 27 | { |
27 | QApplication app(argc, argv); | 28 | QApplication app(argc, argv); |
28 | app.setApplicationVersion(APP_VERSION); | 29 | app.setApplicationVersion(APP_VERSION); |
30 | #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) | ||
31 | /** NOTE: Qt4 only | ||
32 | * use the locale codec as the C-string codec, otherwise QString::toStdString() | ||
33 | * performs as toLatin1() which breaks conversion on virtually all systems. | ||
34 | * FIXME The documentation mentions that the C-string codec should produce ASCII | ||
35 | * compatible (ie 7-bit) encodings but nowadays most system are using UTF-8 | ||
36 | * so I don't see why this is a problem */ | ||
37 | QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); | ||
38 | #endif | ||
29 | 39 | ||
30 | Backend backend;; | 40 | Backend backend;; |
31 | QDir dir(QCoreApplication::applicationDirPath()); | 41 | QDir dir(QCoreApplication::applicationDirPath()); |
@@ -47,4 +57,4 @@ int main(int argc, char *argv[]) | |||
47 | MainWindow win(&backend); | 57 | MainWindow win(&backend); |
48 | win.show(); | 58 | win.show(); |
49 | return app.exec(); | 59 | return app.exec(); |
50 | } | 60 | } |
diff --git a/utils/regtools/qeditor/mainwindow.cpp b/utils/regtools/qeditor/mainwindow.cpp index b44306d701..8b83be6bae 100644 --- a/utils/regtools/qeditor/mainwindow.cpp +++ b/utils/regtools/qeditor/mainwindow.cpp | |||
@@ -43,7 +43,7 @@ void DocumentTab::OnModified(bool modified) | |||
43 | m_tab->SetTabModified(this, modified); | 43 | m_tab->SetTabModified(this, modified); |
44 | } | 44 | } |
45 | 45 | ||
46 | void DocumentTab::SetTabWidget(MyTabWidget *tab) | 46 | void DocumentTab::SetTabWidget(DocumentTabWidget *tab) |
47 | { | 47 | { |
48 | m_tab = tab; | 48 | m_tab = tab; |
49 | SetTabName(m_tabname); | 49 | SetTabName(m_tabname); |
@@ -57,17 +57,17 @@ void DocumentTab::SetTabName(const QString& name) | |||
57 | } | 57 | } |
58 | 58 | ||
59 | /** | 59 | /** |
60 | * MyTabWidget | 60 | * DocumentTabWidget |
61 | */ | 61 | */ |
62 | 62 | ||
63 | MyTabWidget::MyTabWidget() | 63 | DocumentTabWidget::DocumentTabWidget() |
64 | { | 64 | { |
65 | setMovable(true); | 65 | setMovable(true); |
66 | setTabsClosable(true); | 66 | setTabsClosable(true); |
67 | connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(OnCloseTab(int))); | 67 | connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(OnCloseTab(int))); |
68 | } | 68 | } |
69 | 69 | ||
70 | void MyTabWidget::SetTabModified(DocumentTab *doc, bool modified) | 70 | void DocumentTabWidget::SetTabModified(DocumentTab *doc, bool modified) |
71 | { | 71 | { |
72 | int index = indexOf(doc->GetWidget()); | 72 | int index = indexOf(doc->GetWidget()); |
73 | if(modified) | 73 | if(modified) |
@@ -76,12 +76,12 @@ void MyTabWidget::SetTabModified(DocumentTab *doc, bool modified) | |||
76 | setTabIcon(index, QIcon()); | 76 | setTabIcon(index, QIcon()); |
77 | } | 77 | } |
78 | 78 | ||
79 | void MyTabWidget::SetTabName(DocumentTab *doc, const QString& name) | 79 | void DocumentTabWidget::SetTabName(DocumentTab *doc, const QString& name) |
80 | { | 80 | { |
81 | setTabText(indexOf(doc->GetWidget()), name); | 81 | setTabText(indexOf(doc->GetWidget()), name); |
82 | } | 82 | } |
83 | 83 | ||
84 | bool MyTabWidget::CloseTab(int index) | 84 | bool DocumentTabWidget::CloseTab(int index) |
85 | { | 85 | { |
86 | QWidget *w = this->widget(index); | 86 | QWidget *w = this->widget(index); |
87 | DocumentTab *doc = dynamic_cast< DocumentTab* >(w); | 87 | DocumentTab *doc = dynamic_cast< DocumentTab* >(w); |
@@ -95,7 +95,7 @@ bool MyTabWidget::CloseTab(int index) | |||
95 | return false; | 95 | return false; |
96 | } | 96 | } |
97 | 97 | ||
98 | void MyTabWidget::OnCloseTab(int index) | 98 | void DocumentTabWidget::OnCloseTab(int index) |
99 | { | 99 | { |
100 | CloseTab(index); | 100 | CloseTab(index); |
101 | } | 101 | } |
@@ -135,7 +135,9 @@ MainWindow::MainWindow(Backend *backend) | |||
135 | about_menu->addAction(about_act); | 135 | about_menu->addAction(about_act); |
136 | about_menu->addAction(about_qt_act); | 136 | about_menu->addAction(about_qt_act); |
137 | 137 | ||
138 | m_tab = new MyTabWidget(); | 138 | m_tab = new DocumentTabWidget(); |
139 | m_tab->setTabOpenable(true); | ||
140 | m_tab->setTabOpenMenu(new_submenu); | ||
139 | 141 | ||
140 | setCentralWidget(m_tab); | 142 | setCentralWidget(m_tab); |
141 | 143 | ||
@@ -161,8 +163,8 @@ void MainWindow::OnQuit() | |||
161 | 163 | ||
162 | void MainWindow::OnAbout() | 164 | void MainWindow::OnAbout() |
163 | { | 165 | { |
164 | QString soc_desc_ver = QString("%1.%2.%3").arg(MAJOR_VERSION) | 166 | QString soc_desc_ver = QString("%1.%2.%3").arg(soc_desc::MAJOR_VERSION) |
165 | .arg(MINOR_VERSION).arg(REVISION_VERSION); | 167 | .arg(soc_desc::MINOR_VERSION).arg(soc_desc::REVISION_VERSION); |
166 | QMessageBox::about(this, "About", | 168 | QMessageBox::about(this, "About", |
167 | "<h1>QEditor</h1>" | 169 | "<h1>QEditor</h1>" |
168 | "<h2>Version "APP_VERSION"</h2>" | 170 | "<h2>Version "APP_VERSION"</h2>" |
@@ -193,7 +195,10 @@ void MainWindow::closeEvent(QCloseEvent *event) | |||
193 | void MainWindow::OnLoadDesc() | 195 | void MainWindow::OnLoadDesc() |
194 | { | 196 | { |
195 | QFileDialog *fd = new QFileDialog(this); | 197 | QFileDialog *fd = new QFileDialog(this); |
196 | fd->setFilter("XML files (*.xml);;All files (*)"); | 198 | QStringList filters; |
199 | filters << "XML files (*.xml)"; | ||
200 | filters << "All files (*)"; | ||
201 | fd->setNameFilters(filters); | ||
197 | fd->setFileMode(QFileDialog::ExistingFiles); | 202 | fd->setFileMode(QFileDialog::ExistingFiles); |
198 | fd->setDirectory(Settings::Get()->value("loaddescdir", QDir::currentPath()).toString()); | 203 | fd->setDirectory(Settings::Get()->value("loaddescdir", QDir::currentPath()).toString()); |
199 | if(fd->exec()) | 204 | if(fd->exec()) |
diff --git a/utils/regtools/qeditor/mainwindow.h b/utils/regtools/qeditor/mainwindow.h index c5da66758e..5d0bf4ed06 100644 --- a/utils/regtools/qeditor/mainwindow.h +++ b/utils/regtools/qeditor/mainwindow.h | |||
@@ -26,8 +26,9 @@ | |||
26 | #include <QSettings> | 26 | #include <QSettings> |
27 | #include "backend.h" | 27 | #include "backend.h" |
28 | #include "settings.h" | 28 | #include "settings.h" |
29 | #include "utils.h" | ||
29 | 30 | ||
30 | class MyTabWidget; | 31 | class DocumentTabWidget; |
31 | 32 | ||
32 | class DocumentTab | 33 | class DocumentTab |
33 | { | 34 | { |
@@ -35,20 +36,20 @@ public: | |||
35 | DocumentTab() { m_tab = 0; } | 36 | DocumentTab() { m_tab = 0; } |
36 | virtual bool Quit() = 0; | 37 | virtual bool Quit() = 0; |
37 | virtual QWidget *GetWidget() = 0; | 38 | virtual QWidget *GetWidget() = 0; |
38 | void SetTabWidget(MyTabWidget *tab); | 39 | void SetTabWidget(DocumentTabWidget *tab); |
39 | 40 | ||
40 | protected: | 41 | protected: |
41 | void OnModified(bool modified); | 42 | void OnModified(bool modified); |
42 | void SetTabName(const QString& name); | 43 | void SetTabName(const QString& name); |
43 | MyTabWidget *m_tab; | 44 | DocumentTabWidget *m_tab; |
44 | QString m_tabname; | 45 | QString m_tabname; |
45 | }; | 46 | }; |
46 | 47 | ||
47 | class MyTabWidget : public QTabWidget | 48 | class DocumentTabWidget : public YTabWidget |
48 | { | 49 | { |
49 | Q_OBJECT | 50 | Q_OBJECT |
50 | public: | 51 | public: |
51 | MyTabWidget(); | 52 | DocumentTabWidget(); |
52 | bool CloseTab(int index); | 53 | bool CloseTab(int index); |
53 | void SetTabModified(DocumentTab *tab, bool mod); | 54 | void SetTabModified(DocumentTab *tab, bool mod); |
54 | void SetTabName(DocumentTab *tab, const QString& name); | 55 | void SetTabName(DocumentTab *tab, const QString& name); |
@@ -83,7 +84,7 @@ private slots: | |||
83 | void OnNewRegEdit(); | 84 | void OnNewRegEdit(); |
84 | 85 | ||
85 | private: | 86 | private: |
86 | MyTabWidget *m_tab; | 87 | DocumentTabWidget *m_tab; |
87 | Backend *m_backend; | 88 | Backend *m_backend; |
88 | }; | 89 | }; |
89 | 90 | ||
diff --git a/utils/regtools/qeditor/qeditor.pro b/utils/regtools/qeditor/qeditor.pro index 265cc93171..0ec7c3dde1 100644 --- a/utils/regtools/qeditor/qeditor.pro +++ b/utils/regtools/qeditor/qeditor.pro | |||
@@ -12,7 +12,7 @@ libsocdesc.commands = cd ../lib && make | |||
12 | QMAKE_EXTRA_TARGETS += libsocdesc | 12 | QMAKE_EXTRA_TARGETS += libsocdesc |
13 | PRE_TARGETDEPS += libsocdesc | 13 | PRE_TARGETDEPS += libsocdesc |
14 | 14 | ||
15 | VERSION = 2.1.0 | 15 | VERSION = 3.0.0 |
16 | 16 | ||
17 | DEFINES += APP_VERSION=\\\"$$VERSION\\\" | 17 | DEFINES += APP_VERSION=\\\"$$VERSION\\\" |
18 | 18 | ||
diff --git a/utils/regtools/qeditor/regdisplaypanel.cpp b/utils/regtools/qeditor/regdisplaypanel.cpp index 167c776cce..a72d280d6c 100644 --- a/utils/regtools/qeditor/regdisplaypanel.cpp +++ b/utils/regtools/qeditor/regdisplaypanel.cpp | |||
@@ -21,36 +21,26 @@ | |||
21 | #include "regdisplaypanel.h" | 21 | #include "regdisplaypanel.h" |
22 | #include <QHeaderView> | 22 | #include <QHeaderView> |
23 | #include <QDebug> | 23 | #include <QDebug> |
24 | 24 | #include <QStandardItemModel> | |
25 | /** | ||
26 | * RegItemEditorCreator | ||
27 | */ | ||
28 | |||
29 | QWidget *RegItemEditorCreator::createWidget(QWidget * parent) const | ||
30 | { | ||
31 | return new RegLineEdit(parent); | ||
32 | } | ||
33 | |||
34 | QByteArray RegItemEditorCreator::valuePropertyName () const | ||
35 | { | ||
36 | return QByteArray("text"); | ||
37 | } | ||
38 | 25 | ||
39 | /** | 26 | /** |
40 | * SocDisplayPanel | 27 | * SocDisplayPanel |
41 | */ | 28 | */ |
42 | SocDisplayPanel::SocDisplayPanel(QWidget *parent, const SocRef& dev_ref) | 29 | SocDisplayPanel::SocDisplayPanel(QWidget *parent, IoBackend *io_backend, |
43 | :QGroupBox(parent), m_soc(dev_ref) | 30 | const soc_desc::soc_ref_t& ref) |
31 | :QGroupBox(parent), m_soc(ref) | ||
44 | { | 32 | { |
33 | Q_UNUSED(io_backend) | ||
45 | QVBoxLayout *right_layout = new QVBoxLayout; | 34 | QVBoxLayout *right_layout = new QVBoxLayout; |
46 | 35 | ||
47 | m_name = new QLabel(this); | 36 | m_name = new QLabel(this); |
48 | m_name->setTextFormat(Qt::RichText); | 37 | m_name->setTextFormat(Qt::RichText); |
49 | m_name->setText("<h1>" + QString::fromStdString(m_soc.GetSoc().name) + "</h1>"); | 38 | m_name->setText("<h1>" + QString::fromStdString(m_soc.get()->name) + "</h1>"); |
50 | 39 | ||
51 | m_desc = new QLabel(this); | 40 | m_desc = new QLabel(this); |
52 | m_name->setTextFormat(Qt::RichText); | 41 | m_name->setTextFormat(Qt::RichText); |
53 | m_desc->setText(QString::fromStdString(m_soc.GetSoc().desc)); | 42 | m_desc->setText(QString::fromStdString(m_soc.get()->desc)); |
43 | m_desc->setVisible(m_desc->text().size() != 0); | ||
54 | 44 | ||
55 | right_layout->addWidget(m_name, 0); | 45 | right_layout->addWidget(m_name, 0); |
56 | right_layout->addWidget(m_desc, 0); | 46 | right_layout->addWidget(m_desc, 0); |
@@ -71,24 +61,21 @@ QWidget *SocDisplayPanel::GetWidget() | |||
71 | } | 61 | } |
72 | 62 | ||
73 | /** | 63 | /** |
74 | * DevDisplayPanel | 64 | * NodeDisplayPanel |
75 | */ | 65 | */ |
76 | DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref) | 66 | NodeDisplayPanel::NodeDisplayPanel(QWidget *parent, IoBackend *io_backend, |
77 | :QGroupBox(parent), m_dev(dev_ref), m_reg_font(font()) | 67 | const soc_desc::node_inst_t& ref) |
68 | :QGroupBox(parent), m_node(ref) | ||
78 | { | 69 | { |
70 | BackendHelper helper(io_backend, ref.soc()); | ||
79 | QVBoxLayout *right_layout = new QVBoxLayout; | 71 | QVBoxLayout *right_layout = new QVBoxLayout; |
80 | const soc_dev_addr_t& dev_addr = m_dev.GetDevAddr(); | ||
81 | |||
82 | m_reg_font.setWeight(100); | ||
83 | m_reg_font.setKerning(false); | ||
84 | 72 | ||
85 | QString dev_name; | 73 | QString dev_name = helper.GetPath(ref); |
86 | dev_name.sprintf("HW_%s_BASE", dev_addr.name.c_str()); | ||
87 | 74 | ||
88 | QLabel *label_names = new QLabel("<b>" + dev_name + "</b>"); | 75 | QLabel *label_names = new QLabel("<b>" + dev_name + "</b>"); |
89 | label_names->setTextFormat(Qt::RichText); | 76 | label_names->setTextFormat(Qt::RichText); |
90 | 77 | ||
91 | QLabel *label_addr = new QLabel("<b>" + QString().sprintf("0x%03x", dev_addr.addr) + "</b>"); | 78 | QLabel *label_addr = new QLabel("<b>" + QString().sprintf("0x%03x", ref.addr()) + "</b>"); |
92 | label_addr->setTextFormat(Qt::RichText); | 79 | label_addr->setTextFormat(Qt::RichText); |
93 | 80 | ||
94 | QHBoxLayout *top_layout = new QHBoxLayout; | 81 | QHBoxLayout *top_layout = new QHBoxLayout; |
@@ -99,27 +86,38 @@ DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref) | |||
99 | 86 | ||
100 | m_name = new QLabel(this); | 87 | m_name = new QLabel(this); |
101 | m_name->setTextFormat(Qt::RichText); | 88 | m_name->setTextFormat(Qt::RichText); |
102 | m_name->setText("<h1>" + QString::fromStdString(m_dev.GetDev().long_name) + "</h1>"); | 89 | /* if instance has a title, it overrides node title.*/ |
103 | 90 | std::string title = ref.get()->title; | |
104 | m_desc = new QLabel(this); | 91 | if(title.empty()) |
105 | m_name->setTextFormat(Qt::RichText); | 92 | title = ref.node().get()->title; |
106 | m_desc->setText(QString::fromStdString(m_dev.GetDev().desc)); | 93 | m_name->setText("<h1>" + QString::fromStdString(title) + "</h1>"); |
94 | |||
95 | /* put description from the node and from the instance */ | ||
96 | m_node_desc = new QLabel(this); | ||
97 | m_node_desc->setTextFormat(Qt::RichText); | ||
98 | m_node_desc->setText(QString::fromStdString(ref.node().get()->desc)); | ||
99 | m_node_desc->setVisible(m_node_desc->text().size() != 0); | ||
100 | m_inst_desc = new QLabel(this); | ||
101 | m_inst_desc->setTextFormat(Qt::RichText); | ||
102 | m_inst_desc->setText(QString::fromStdString(ref.get()->desc)); | ||
103 | m_inst_desc->setVisible(m_inst_desc->text().size() != 0); | ||
107 | 104 | ||
108 | right_layout->addWidget(m_name, 0); | 105 | right_layout->addWidget(m_name, 0); |
109 | right_layout->addLayout(top_layout, 0); | 106 | right_layout->addLayout(top_layout, 0); |
110 | right_layout->addWidget(m_desc, 0); | 107 | right_layout->addWidget(m_node_desc, 0); |
108 | right_layout->addWidget(m_inst_desc, 0); | ||
111 | right_layout->addStretch(1); | 109 | right_layout->addStretch(1); |
112 | 110 | ||
113 | setTitle("Device Description"); | 111 | setTitle("Device Description"); |
114 | setLayout(right_layout); | 112 | setLayout(right_layout); |
115 | } | 113 | } |
116 | 114 | ||
117 | void DevDisplayPanel::AllowWrite(bool en) | 115 | void NodeDisplayPanel::AllowWrite(bool en) |
118 | { | 116 | { |
119 | Q_UNUSED(en); | 117 | Q_UNUSED(en); |
120 | } | 118 | } |
121 | 119 | ||
122 | QWidget *DevDisplayPanel::GetWidget() | 120 | QWidget *NodeDisplayPanel::GetWidget() |
123 | { | 121 | { |
124 | return this; | 122 | return this; |
125 | } | 123 | } |
@@ -128,34 +126,29 @@ QWidget *DevDisplayPanel::GetWidget() | |||
128 | * RegDisplayPanel | 126 | * RegDisplayPanel |
129 | */ | 127 | */ |
130 | 128 | ||
131 | RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg_ref) | 129 | RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, |
132 | :QGroupBox(parent), m_io_backend(io_backend), m_reg(reg_ref), m_reg_font(font()) | 130 | const soc_desc::node_inst_t& ref) |
131 | :QGroupBox(parent), m_io_backend(io_backend), m_node(ref), m_reg_font(font()) | ||
133 | { | 132 | { |
134 | bool read_only = m_io_backend->IsReadOnly(); | 133 | bool read_only = m_io_backend->IsReadOnly(); |
134 | BackendHelper helper(m_io_backend, ref.soc()); | ||
135 | 135 | ||
136 | QVBoxLayout *right_layout = new QVBoxLayout; | 136 | QVBoxLayout *right_layout = new QVBoxLayout; |
137 | 137 | ||
138 | const soc_dev_addr_t& dev_addr = m_reg.GetDevAddr(); | ||
139 | const soc_reg_t& reg = m_reg.GetReg(); | ||
140 | const soc_reg_addr_t& reg_addr = m_reg.GetRegAddr(); | ||
141 | |||
142 | m_reg_font.setWeight(100); | 138 | m_reg_font.setWeight(100); |
143 | m_reg_font.setKerning(false); | 139 | m_reg_font.setKerning(false); |
144 | 140 | ||
145 | QString reg_name; | 141 | QString reg_name = helper.GetPath(ref); |
146 | reg_name.sprintf("HW_%s_%s", dev_addr.name.c_str(), reg_addr.name.c_str()); | ||
147 | QStringList names; | 142 | QStringList names; |
148 | QVector< soc_addr_t > addresses; | 143 | QVector< soc_addr_t > addresses; |
149 | names.append(reg_name); | 144 | names.append(reg_name); |
150 | addresses.append(reg_addr.addr); | 145 | addresses.append(ref.addr()); |
151 | if(reg.flags & REG_HAS_SCT) | 146 | |
147 | std::vector< soc_desc::variant_ref_t > variants = ref.node().reg().variants(); | ||
148 | for(size_t i = 0; i < variants.size(); i++) | ||
152 | { | 149 | { |
153 | names.append(reg_name + "_SET"); | 150 | names.append(reg_name + "/" + QString::fromStdString(variants[i].get()->type)); |
154 | names.append(reg_name + "_CLR"); | 151 | addresses.append(ref.addr() + variants[i].get()->offset); |
155 | names.append(reg_name + "_TOG"); | ||
156 | addresses.append(reg_addr.addr + 4); | ||
157 | addresses.append(reg_addr.addr + 8); | ||
158 | addresses.append(reg_addr.addr + 12); | ||
159 | } | 152 | } |
160 | 153 | ||
161 | QString str; | 154 | QString str; |
@@ -188,7 +181,7 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S | |||
188 | m_raw_val_edit->SetReadOnly(read_only); | 181 | m_raw_val_edit->SetReadOnly(read_only); |
189 | m_raw_val_edit->GetLineEdit()->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); | 182 | m_raw_val_edit->GetLineEdit()->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); |
190 | m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit)); | 183 | m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit)); |
191 | m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT)); | 184 | //m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT)); |
192 | m_raw_val_edit->GetLineEdit()->setFont(m_reg_font); | 185 | m_raw_val_edit->GetLineEdit()->setFont(m_reg_font); |
193 | QHBoxLayout *raw_val_layout = new QHBoxLayout; | 186 | QHBoxLayout *raw_val_layout = new QHBoxLayout; |
194 | raw_val_layout->addStretch(); | 187 | raw_val_layout->addStretch(); |
@@ -198,9 +191,13 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S | |||
198 | 191 | ||
199 | m_value_table = new GrowingTableView(); | 192 | m_value_table = new GrowingTableView(); |
200 | m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership | 193 | m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership |
201 | m_value_model->SetRegister(m_reg.GetReg()); | 194 | m_value_model->SetRegister(*m_node.node().reg().get()); |
202 | m_value_model->SetReadOnly(read_only); | 195 | m_value_model->SetReadOnly(read_only); |
203 | m_value_table->setModel(m_value_model); | 196 | RegFieldProxyModel *proxy_model = new RegFieldProxyModel(this); |
197 | proxy_model->setSourceModel(m_value_model); | ||
198 | m_value_table->setModel(proxy_model); | ||
199 | m_value_table->setSortingEnabled(true); | ||
200 | m_value_table->sortByColumn(0, Qt::DescendingOrder); | ||
204 | m_value_table->verticalHeader()->setVisible(false); | 201 | m_value_table->verticalHeader()->setVisible(false); |
205 | m_value_table->resizeColumnsToContents(); | 202 | m_value_table->resizeColumnsToContents(); |
206 | m_value_table->horizontalHeader()->setStretchLastSection(true); | 203 | m_value_table->horizontalHeader()->setStretchLastSection(true); |
@@ -217,17 +214,36 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S | |||
217 | m_table_delegate->setItemEditorFactory(m_table_edit_factory); | 214 | m_table_delegate->setItemEditorFactory(m_table_edit_factory); |
218 | m_value_table->setItemDelegate(m_table_delegate); | 215 | m_value_table->setItemDelegate(m_table_delegate); |
219 | 216 | ||
220 | m_sexy_display2 = new Unscroll<RegSexyDisplay2>(this); | 217 | m_sexy_display2 = new Unscroll<YRegDisplay>(this); |
221 | m_sexy_display2->setFont(m_reg_font); | 218 | m_sexy_display2->setFont(m_reg_font); |
222 | m_sexy_display2->setModel(m_value_model); | 219 | m_sexy_display2->setModel(m_value_model); |
220 | m_sexy_display2->setWidth(m_node.node().reg().get()->width); | ||
223 | m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | 221 | m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); |
224 | 222 | ||
223 | m_name = new QLabel(this); | ||
224 | m_name->setTextFormat(Qt::RichText); | ||
225 | m_name->setText("<h1>" + QString::fromStdString(ref.node().get()->title) + "</h1>"); | ||
226 | |||
227 | /* put description from the node, from the instance and register */ | ||
228 | m_node_desc = new QLabel(this); | ||
229 | m_node_desc->setTextFormat(Qt::RichText); | ||
230 | m_node_desc->setText(QString::fromStdString(ref.node().get()->desc)); | ||
231 | m_node_desc->setVisible(m_node_desc->text().size() != 0); | ||
232 | m_inst_desc = new QLabel(this); | ||
233 | m_inst_desc->setTextFormat(Qt::RichText); | ||
234 | m_inst_desc->setText(QString::fromStdString(ref.get()->desc)); | ||
235 | m_inst_desc->setVisible(m_inst_desc->text().size() != 0); | ||
225 | m_desc = new QLabel(this); | 236 | m_desc = new QLabel(this); |
226 | m_desc->setTextFormat(Qt::RichText); | 237 | m_desc->setTextFormat(Qt::RichText); |
227 | m_desc->setText(QString::fromStdString(m_reg.GetReg().desc)); | 238 | m_desc->setText(QString::fromStdString(m_node.node().reg().get()->desc)); |
239 | m_desc->setVisible(m_desc->text().size() != 0); | ||
228 | 240 | ||
241 | right_layout->addWidget(m_name); | ||
229 | right_layout->addWidget(m_desc); | 242 | right_layout->addWidget(m_desc); |
230 | right_layout->addLayout(top_layout); | 243 | right_layout->addLayout(top_layout); |
244 | right_layout->addWidget(m_node_desc); | ||
245 | right_layout->addWidget(m_inst_desc); | ||
246 | right_layout->addWidget(m_desc); | ||
231 | if(raw_val_layout) | 247 | if(raw_val_layout) |
232 | right_layout->addLayout(raw_val_layout); | 248 | right_layout->addLayout(raw_val_layout); |
233 | right_layout->addWidget(m_sexy_display2); | 249 | right_layout->addWidget(m_sexy_display2); |
@@ -252,8 +268,10 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S | |||
252 | 268 | ||
253 | connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, | 269 | connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, |
254 | SLOT(OnRawRegValueReturnPressed())); | 270 | SLOT(OnRawRegValueReturnPressed())); |
255 | connect(m_value_table->model(), SIGNAL(OnValueModified(int)), this, | 271 | connect(m_value_model, SIGNAL(OnValueModified(int)), this, |
256 | SLOT(OnRegValueChanged(int))); | 272 | SLOT(OnRegValueChanged(int))); |
273 | connect(m_sexy_display2, SIGNAL(clicked(const QModelIndex&)), this, | ||
274 | SLOT(OnRegFieldActivated(const QModelIndex&))); | ||
257 | } | 275 | } |
258 | 276 | ||
259 | RegDisplayPanel::~RegDisplayPanel() | 277 | RegDisplayPanel::~RegDisplayPanel() |
@@ -263,12 +281,9 @@ RegDisplayPanel::~RegDisplayPanel() | |||
263 | 281 | ||
264 | void RegDisplayPanel::Reload() | 282 | void RegDisplayPanel::Reload() |
265 | { | 283 | { |
266 | const soc_dev_addr_t& dev_addr = m_reg.GetDevAddr(); | ||
267 | const soc_reg_t& reg = m_reg.GetReg(); | ||
268 | const soc_reg_addr_t& reg_addr = m_reg.GetRegAddr(); | ||
269 | soc_word_t value; | 284 | soc_word_t value; |
270 | BackendHelper helper(m_io_backend, m_reg); | 285 | BackendHelper helper(m_io_backend, m_node.soc()); |
271 | bool has_value = helper.ReadRegister(dev_addr.name.c_str(), reg_addr.name.c_str(), value); | 286 | bool has_value = helper.ReadRegister(m_node, value); |
272 | 287 | ||
273 | if(has_value) | 288 | if(has_value) |
274 | { | 289 | { |
@@ -296,7 +311,6 @@ void RegDisplayPanel::AllowWrite(bool en) | |||
296 | m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); | 311 | m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); |
297 | m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); | 312 | m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); |
298 | } | 313 | } |
299 | Reload(); | ||
300 | } | 314 | } |
301 | 315 | ||
302 | IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) | 316 | IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) |
@@ -320,9 +334,8 @@ void RegDisplayPanel::OnRawRegValueReturnPressed() | |||
320 | if(state != QValidator::Acceptable) | 334 | if(state != QValidator::Acceptable) |
321 | return; | 335 | return; |
322 | IoBackend::WriteMode mode = EditModeToWriteMode(m_raw_val_edit->GetMode()); | 336 | IoBackend::WriteMode mode = EditModeToWriteMode(m_raw_val_edit->GetMode()); |
323 | BackendHelper helper(m_io_backend, m_reg); | 337 | BackendHelper helper(m_io_backend, m_node.soc()); |
324 | helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), | 338 | helper.WriteRegister(m_node, val, mode); |
325 | val, mode); | ||
326 | // register write can change all fields | 339 | // register write can change all fields |
327 | Reload(); | 340 | Reload(); |
328 | } | 341 | } |
@@ -332,13 +345,17 @@ void RegDisplayPanel::OnRegValueChanged(int index) | |||
332 | QVariant var = m_value_model->GetValue(index); | 345 | QVariant var = m_value_model->GetValue(index); |
333 | if(!var.isValid()) | 346 | if(!var.isValid()) |
334 | return; | 347 | return; |
335 | BackendHelper helper(m_io_backend, m_reg); | 348 | BackendHelper helper(m_io_backend, m_node.soc()); |
336 | helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), | 349 | helper.WriteRegister(m_node, var.value< soc_word_t >(), IoBackend::Write); |
337 | var.value< soc_word_t >(), IoBackend::Write); | ||
338 | // register write can change all fields | 350 | // register write can change all fields |
339 | Reload(); | 351 | Reload(); |
340 | } | 352 | } |
341 | 353 | ||
354 | void RegDisplayPanel::OnRegFieldActivated(const QModelIndex& index) | ||
355 | { | ||
356 | Q_UNUSED(index); | ||
357 | } | ||
358 | |||
342 | QWidget *RegDisplayPanel::GetWidget() | 359 | QWidget *RegDisplayPanel::GetWidget() |
343 | { | 360 | { |
344 | return this; | 361 | return this; |
diff --git a/utils/regtools/qeditor/regdisplaypanel.h b/utils/regtools/qeditor/regdisplaypanel.h index 9a692778fe..a34b9319d5 100644 --- a/utils/regtools/qeditor/regdisplaypanel.h +++ b/utils/regtools/qeditor/regdisplaypanel.h | |||
@@ -35,19 +35,12 @@ | |||
35 | #include "utils.h" | 35 | #include "utils.h" |
36 | #include "regtab.h" | 36 | #include "regtab.h" |
37 | 37 | ||
38 | class RegItemEditorCreator : public QItemEditorCreatorBase | ||
39 | { | ||
40 | public: | ||
41 | RegItemEditorCreator() {} | ||
42 | virtual QWidget *createWidget(QWidget * parent) const; | ||
43 | virtual QByteArray valuePropertyName () const; | ||
44 | }; | ||
45 | |||
46 | class SocDisplayPanel : public QGroupBox, public RegTabPanel | 38 | class SocDisplayPanel : public QGroupBox, public RegTabPanel |
47 | { | 39 | { |
48 | Q_OBJECT | 40 | Q_OBJECT |
49 | public: | 41 | public: |
50 | SocDisplayPanel(QWidget *parent, const SocRef& reg); | 42 | SocDisplayPanel(QWidget *parent, IoBackend *io_backend, |
43 | const soc_desc::soc_ref_t& reg); | ||
51 | void Reload(); | 44 | void Reload(); |
52 | void AllowWrite(bool en); | 45 | void AllowWrite(bool en); |
53 | QWidget *GetWidget(); | 46 | QWidget *GetWidget(); |
@@ -55,16 +48,17 @@ public: | |||
55 | 48 | ||
56 | protected: | 49 | protected: |
57 | 50 | ||
58 | const SocRef& m_soc; | 51 | soc_desc::soc_ref_t m_soc; |
59 | QLabel *m_name; | 52 | QLabel *m_name; |
60 | QLabel *m_desc; | 53 | QLabel *m_desc; |
61 | }; | 54 | }; |
62 | 55 | ||
63 | class DevDisplayPanel : public QGroupBox, public RegTabPanel | 56 | class NodeDisplayPanel : public QGroupBox, public RegTabPanel |
64 | { | 57 | { |
65 | Q_OBJECT | 58 | Q_OBJECT |
66 | public: | 59 | public: |
67 | DevDisplayPanel(QWidget *parent, const SocDevRef& reg); | 60 | NodeDisplayPanel(QWidget *parent, IoBackend *io_backend, |
61 | const soc_desc::node_inst_t& reg); | ||
68 | void Reload(); | 62 | void Reload(); |
69 | void AllowWrite(bool en); | 63 | void AllowWrite(bool en); |
70 | QWidget *GetWidget(); | 64 | QWidget *GetWidget(); |
@@ -72,17 +66,18 @@ public: | |||
72 | 66 | ||
73 | protected: | 67 | protected: |
74 | 68 | ||
75 | const SocDevRef& m_dev; | 69 | soc_desc::node_inst_t m_node; |
76 | QFont m_reg_font; | ||
77 | QLabel *m_name; | 70 | QLabel *m_name; |
78 | QLabel *m_desc; | 71 | QLabel *m_node_desc; |
72 | QLabel *m_inst_desc; | ||
79 | }; | 73 | }; |
80 | 74 | ||
81 | class RegDisplayPanel : public QGroupBox, public RegTabPanel | 75 | class RegDisplayPanel : public QGroupBox, public RegTabPanel |
82 | { | 76 | { |
83 | Q_OBJECT | 77 | Q_OBJECT |
84 | public: | 78 | public: |
85 | RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg); | 79 | RegDisplayPanel(QWidget *parent, IoBackend *io_backend, |
80 | const soc_desc::node_inst_t& reg); | ||
86 | ~RegDisplayPanel(); | 81 | ~RegDisplayPanel(); |
87 | void AllowWrite(bool en); | 82 | void AllowWrite(bool en); |
88 | void Reload(); | 83 | void Reload(); |
@@ -102,17 +97,19 @@ protected: | |||
102 | }; | 97 | }; |
103 | 98 | ||
104 | IoBackend *m_io_backend; | 99 | IoBackend *m_io_backend; |
105 | const SocRegRef& m_reg; | 100 | soc_desc::node_inst_t m_node; |
106 | bool m_allow_write; | 101 | bool m_allow_write; |
107 | RegLineEdit *m_raw_val_edit; | 102 | RegLineEdit *m_raw_val_edit; |
108 | Unscroll< RegSexyDisplay2 > *m_sexy_display2; | 103 | Unscroll< YRegDisplay > *m_sexy_display2; |
109 | GrowingTableView *m_value_table; | 104 | GrowingTableView *m_value_table; |
110 | RegFieldTableModel *m_value_model; | 105 | RegFieldTableModel *m_value_model; |
111 | QStyledItemDelegate *m_table_delegate; | 106 | QStyledItemDelegate *m_table_delegate; |
112 | QItemEditorFactory *m_table_edit_factory; | 107 | QItemEditorFactory *m_table_edit_factory; |
113 | RegItemEditorCreator *m_regedit_creator; | ||
114 | QLabel *m_raw_val_name; | 108 | QLabel *m_raw_val_name; |
115 | QFont m_reg_font; | 109 | QFont m_reg_font; |
110 | QLabel *m_name; | ||
111 | QLabel *m_node_desc; | ||
112 | QLabel *m_inst_desc; | ||
116 | QLabel *m_desc; | 113 | QLabel *m_desc; |
117 | QWidget *m_viewport; | 114 | QWidget *m_viewport; |
118 | QScrollArea *m_scroll; | 115 | QScrollArea *m_scroll; |
@@ -120,6 +117,7 @@ protected: | |||
120 | private slots: | 117 | private slots: |
121 | void OnRawRegValueReturnPressed(); | 118 | void OnRawRegValueReturnPressed(); |
122 | void OnRegValueChanged(int index); | 119 | void OnRegValueChanged(int index); |
120 | void OnRegFieldActivated(const QModelIndex& index); | ||
123 | }; | 121 | }; |
124 | 122 | ||
125 | #endif /* REGDISPLAYPANEL_H */ | 123 | #endif /* REGDISPLAYPANEL_H */ |
diff --git a/utils/regtools/qeditor/regedit.cpp b/utils/regtools/qeditor/regedit.cpp index 8b4bfb7c49..826452fdbd 100644 --- a/utils/regtools/qeditor/regedit.cpp +++ b/utils/regtools/qeditor/regedit.cpp | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <QHeaderView> | 24 | #include <QHeaderView> |
25 | #include <QMessageBox> | 25 | #include <QMessageBox> |
26 | #include <QInputDialog> | 26 | #include <QInputDialog> |
27 | #include <QStandardItemModel> | ||
27 | 28 | ||
28 | /** | 29 | /** |
29 | * EmptyEditPanel | 30 | * EmptyEditPanel |
@@ -36,863 +37,1300 @@ EmptyEditPanel::EmptyEditPanel(QWidget *parent) | |||
36 | /** | 37 | /** |
37 | * SocEditPanel | 38 | * SocEditPanel |
38 | */ | 39 | */ |
39 | SocEditPanel::SocEditPanel(SocRef ref, QWidget *parent) | 40 | |
41 | namespace | ||
42 | { | ||
43 | |||
44 | template< typename T > | ||
45 | void my_remove_at(std::vector< T >& v, size_t at) | ||
46 | { | ||
47 | v.erase(v.begin() + at); | ||
48 | } | ||
49 | |||
50 | enum | ||
51 | { | ||
52 | SocEditPanelDelType = QTableWidgetItem::UserType, | ||
53 | SocEditPanelAddType, | ||
54 | }; | ||
55 | |||
56 | } | ||
57 | |||
58 | SocEditPanel::SocEditPanel(const soc_desc::soc_ref_t& ref, QWidget *parent) | ||
40 | :QWidget(parent), m_ref(ref) | 59 | :QWidget(parent), m_ref(ref) |
41 | { | 60 | { |
42 | m_name_group = new QGroupBox("Name", this); | 61 | QLineEdit *name_edit = new QLineEdit(this); |
43 | m_name_edit = new QLineEdit(this); | 62 | QLineEdit *title_edit = new QLineEdit(this); |
44 | m_name_edit->setText(QString::fromStdString(ref.GetSoc().name)); | 63 | QLineEdit *isa_edit = new QLineEdit(this); |
45 | QVBoxLayout *name_group_layout = new QVBoxLayout; | 64 | QLineEdit *version_edit = new QLineEdit(this); |
46 | name_group_layout->addWidget(m_name_edit); | 65 | |
47 | m_name_group->setLayout(name_group_layout); | 66 | m_authors_list = new QTableWidget(this); |
67 | QGroupBox *authors_group = Misc::EncloseInBox("Authors", m_authors_list); | ||
48 | 68 | ||
49 | m_desc_group = new QGroupBox("Description", this); | ||
50 | QHBoxLayout *group_layout = new QHBoxLayout; | ||
51 | m_desc_edit = new MyTextEditor(this); | 69 | m_desc_edit = new MyTextEditor(this); |
52 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetSoc().desc)); | 70 | |
53 | group_layout->addWidget(m_desc_edit); | 71 | QGroupBox *desc_group = Misc::EncloseInBox("Description", m_desc_edit); |
54 | m_desc_group->setLayout(group_layout); | 72 | |
73 | QFormLayout *banner_left_layout = new QFormLayout; | ||
74 | banner_left_layout->addRow("Name:", name_edit); | ||
75 | banner_left_layout->addRow("Title:", title_edit); | ||
76 | banner_left_layout->addRow("Instruction Set:", isa_edit); | ||
77 | banner_left_layout->addRow("Version:", version_edit); | ||
78 | |||
79 | QGroupBox *banner_left_group = new QGroupBox("Information"); | ||
80 | banner_left_group->setLayout(banner_left_layout); | ||
81 | |||
82 | QHBoxLayout *banner_layout = new QHBoxLayout; | ||
83 | banner_layout->addWidget(banner_left_group); | ||
84 | banner_layout->addWidget(authors_group); | ||
85 | banner_layout->addStretch(0); | ||
55 | 86 | ||
56 | QVBoxLayout *layout = new QVBoxLayout; | 87 | QVBoxLayout *layout = new QVBoxLayout; |
57 | layout->addWidget(m_name_group); | 88 | layout->addLayout(banner_layout); |
58 | layout->addWidget(m_desc_group); | 89 | layout->addWidget(desc_group); |
59 | layout->addStretch(1); | 90 | layout->addStretch(1); |
60 | 91 | ||
61 | connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&))); | 92 | /* fill data */ |
93 | name_edit->setText(QString::fromStdString(ref.get()->name)); | ||
94 | title_edit->setText(QString::fromStdString(ref.get()->title)); | ||
95 | isa_edit->setText(QString::fromStdString(ref.get()->isa)); | ||
96 | version_edit->setText(QString::fromStdString(ref.get()->version)); | ||
97 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.get()->desc)); | ||
98 | |||
99 | m_authors_list->setColumnCount(2); | ||
100 | m_authors_list->setHorizontalHeaderItem(0, new QTableWidgetItem("")); | ||
101 | m_authors_list->setHorizontalHeaderItem(1, new QTableWidgetItem("Name")); | ||
102 | m_authors_list->horizontalHeader()->setVisible(false); | ||
103 | m_authors_list->verticalHeader()->setVisible(false); | ||
104 | m_authors_list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
105 | std::vector< std::string >& authors = ref.get()->author; | ||
106 | m_authors_list->setRowCount(authors.size() + 1); | ||
107 | for(size_t i = 0; i < authors.size(); i++) | ||
108 | { | ||
109 | QTableWidgetItem *item = new QTableWidgetItem( | ||
110 | QIcon::fromTheme("list-remove"), "", SocEditPanelDelType); | ||
111 | item->setFlags(Qt::ItemIsEnabled); | ||
112 | m_authors_list->setItem(i, 0, item); | ||
113 | item = new QTableWidgetItem(QString::fromStdString(authors[i])); | ||
114 | m_authors_list->setItem(i, 1, item); | ||
115 | } | ||
116 | QTableWidgetItem *new_item = new QTableWidgetItem( | ||
117 | QIcon::fromTheme("list-add"), "", SocEditPanelAddType); | ||
118 | new_item->setFlags(Qt::ItemIsEnabled); | ||
119 | m_authors_list->setItem(authors.size(), 0, new_item); | ||
120 | new_item = new QTableWidgetItem("New author...", QTableWidgetItem::UserType); | ||
121 | new_item->setFlags(Qt::ItemIsEnabled); | ||
122 | QFont font = new_item->font(); | ||
123 | font.setItalic(true); | ||
124 | new_item->setFont(font); | ||
125 | m_authors_list->setItem(authors.size(), 1, new_item); | ||
126 | m_authors_list->resizeColumnsToContents(); | ||
127 | m_authors_list->horizontalHeader()->setStretchLastSection(true); | ||
128 | |||
129 | connect(name_edit, SIGNAL(textChanged(const QString&)), this, | ||
130 | SLOT(OnNameEdited(const QString&))); | ||
62 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnTextEdited())); | 131 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnTextEdited())); |
132 | connect(title_edit, SIGNAL(textChanged(const QString&)), this, | ||
133 | SLOT(OnTitleEdited(const QString&))); | ||
134 | connect(version_edit, SIGNAL(textChanged(const QString&)), this, | ||
135 | SLOT(OnVersionEdited(const QString&))); | ||
136 | connect(isa_edit, SIGNAL(textChanged(const QString&)), this, | ||
137 | SLOT(OnIsaEdited(const QString&))); | ||
138 | connect(m_authors_list, SIGNAL(itemActivated(QTableWidgetItem *)), this, | ||
139 | SLOT(OnAuthorActivated(QTableWidgetItem *))); | ||
140 | connect(m_authors_list, SIGNAL(itemChanged(QTableWidgetItem *)), this, | ||
141 | SLOT(OnAuthorChanged(QTableWidgetItem *))); | ||
63 | 142 | ||
64 | setLayout(layout); | 143 | setLayout(layout); |
65 | } | 144 | } |
66 | 145 | ||
67 | void SocEditPanel::OnNameEdited(const QString& text) | 146 | void SocEditPanel::OnNameEdited(const QString& text) |
68 | { | 147 | { |
69 | m_ref.GetSoc().name = text.toStdString(); | 148 | m_ref.get()->name = text.toStdString(); |
70 | OnModified(m_name_edit->isModified()); | 149 | OnModified(); |
71 | } | 150 | } |
72 | 151 | ||
73 | void SocEditPanel::OnTextEdited() | 152 | void SocEditPanel::OnTitleEdited(const QString& text) |
74 | { | 153 | { |
75 | m_ref.GetSoc().desc = m_desc_edit->GetTextHtml().toStdString(); | 154 | m_ref.get()->title = text.toStdString(); |
76 | OnModified(m_desc_edit->IsModified()); | 155 | OnModified(); |
77 | } | 156 | } |
78 | 157 | ||
79 | /** | 158 | void SocEditPanel::OnVersionEdited(const QString& text) |
80 | * DevEditPanel | ||
81 | */ | ||
82 | DevEditPanel::DevEditPanel(SocDevRef ref, QWidget *parent) | ||
83 | :QWidget(parent), m_ref(ref) | ||
84 | { | 159 | { |
85 | m_name_group = new QGroupBox("Name", this); | 160 | m_ref.get()->version = text.toStdString(); |
86 | m_name_edit = new QLineEdit(this); | 161 | OnModified(); |
87 | m_name_edit->setText(QString::fromStdString(ref.GetDev().name)); | 162 | } |
88 | QVBoxLayout *name_group_layout = new QVBoxLayout; | ||
89 | name_group_layout->addWidget(m_name_edit); | ||
90 | m_name_group->setLayout(name_group_layout); | ||
91 | |||
92 | m_long_name_group = new QGroupBox("Long Name", this); | ||
93 | m_long_name_edit = new QLineEdit(this); | ||
94 | m_long_name_edit->setText(QString::fromStdString(ref.GetDev().long_name)); | ||
95 | QVBoxLayout *long_name_group_layout = new QVBoxLayout; | ||
96 | long_name_group_layout->addWidget(m_long_name_edit); | ||
97 | m_long_name_group->setLayout(long_name_group_layout); | ||
98 | |||
99 | m_version_group = new QGroupBox("Version", this); | ||
100 | m_version_edit = new QLineEdit(this); | ||
101 | m_version_edit->setText(QString::fromStdString(ref.GetDev().version)); | ||
102 | QVBoxLayout *version_group_layout = new QVBoxLayout; | ||
103 | version_group_layout->addWidget(m_version_edit); | ||
104 | m_version_group->setLayout(version_group_layout); | ||
105 | |||
106 | QVBoxLayout *name_ver_layout = new QVBoxLayout; | ||
107 | name_ver_layout->addWidget(m_name_group); | ||
108 | name_ver_layout->addWidget(m_long_name_group); | ||
109 | name_ver_layout->addWidget(m_version_group); | ||
110 | name_ver_layout->addStretch(); | ||
111 | |||
112 | m_instances_table = new QTableWidget(this); | ||
113 | m_instances_table->setRowCount(ref.GetDev().addr.size() + 1); | ||
114 | m_instances_table->setColumnCount(3); | ||
115 | for(size_t row = 0; row < ref.GetDev().addr.size(); row++) | ||
116 | FillRow(row, ref.GetDev().addr[row]); | ||
117 | CreateNewRow(ref.GetDev().addr.size()); | ||
118 | m_instances_table->setHorizontalHeaderItem(0, new QTableWidgetItem("")); | ||
119 | m_instances_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name")); | ||
120 | m_instances_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Address")); | ||
121 | m_instances_table->verticalHeader()->setVisible(false); | ||
122 | m_instances_table->resizeColumnsToContents(); | ||
123 | m_instances_table->horizontalHeader()->setStretchLastSection(true); | ||
124 | m_instances_table->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); | ||
125 | m_instances_group = new QGroupBox("Instances", this); | ||
126 | QHBoxLayout *instances_group_layout = new QHBoxLayout; | ||
127 | instances_group_layout->addWidget(m_instances_table); | ||
128 | m_instances_group->setLayout(instances_group_layout); | ||
129 | |||
130 | QHBoxLayout *top_layout = new QHBoxLayout; | ||
131 | top_layout->addWidget(m_instances_group); | ||
132 | top_layout->addLayout(name_ver_layout); | ||
133 | top_layout->addStretch(); | ||
134 | |||
135 | m_desc_group = new QGroupBox("Description", this); | ||
136 | QHBoxLayout *group_layout = new QHBoxLayout; | ||
137 | m_desc_edit = new MyTextEditor(this); | ||
138 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetDev().desc)); | ||
139 | group_layout->addWidget(m_desc_edit); | ||
140 | m_desc_group->setLayout(group_layout); | ||
141 | |||
142 | QVBoxLayout *layout = new QVBoxLayout; | ||
143 | layout->addLayout(top_layout, 0); | ||
144 | layout->addWidget(m_desc_group, 1); | ||
145 | |||
146 | setLayout(layout); | ||
147 | 163 | ||
148 | SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(this); | 164 | void SocEditPanel::OnIsaEdited(const QString& text) |
149 | QItemEditorFactory *m_table_edit_factory = new QItemEditorFactory(); | 165 | { |
150 | SocFieldEditorCreator *m_table_edit_creator = new SocFieldEditorCreator(); | 166 | m_ref.get()->isa = text.toStdString(); |
151 | m_table_edit_factory->registerEditor(QVariant::UInt, m_table_edit_creator); | 167 | OnModified(); |
152 | m_table_delegate->setItemEditorFactory(m_table_edit_factory); | ||
153 | m_instances_table->setItemDelegate(m_table_delegate); | ||
154 | |||
155 | connect(m_instances_table, SIGNAL(cellActivated(int,int)), this, SLOT(OnInstActivated(int,int))); | ||
156 | connect(m_instances_table, SIGNAL(cellChanged(int,int)), this, SLOT(OnInstChanged(int,int))); | ||
157 | connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&))); | ||
158 | connect(m_long_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnLongNameEdited(const QString&))); | ||
159 | connect(m_version_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnVersionEdited(const QString&))); | ||
160 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited())); | ||
161 | } | 168 | } |
162 | 169 | ||
163 | void DevEditPanel::OnNameEdited(const QString& text) | 170 | void SocEditPanel::OnTextEdited() |
164 | { | 171 | { |
165 | m_ref.GetDev().name = text.toStdString(); | 172 | m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString(); |
166 | OnModified(m_name_edit->isModified()); | 173 | OnModified(); |
167 | } | 174 | } |
168 | 175 | ||
169 | void DevEditPanel::OnLongNameEdited(const QString& text) | 176 | void SocEditPanel::OnAuthorActivated(QTableWidgetItem *item) |
170 | { | 177 | { |
171 | m_ref.GetDev().long_name = text.toStdString(); | 178 | if(item->type() == SocEditPanelDelType) |
172 | OnModified(m_long_name_edit->isModified()); | 179 | { |
180 | int row = item->row(); | ||
181 | my_remove_at(m_ref.get()->author, row); | ||
182 | m_authors_list->removeRow(row); | ||
183 | OnModified(); | ||
184 | } | ||
185 | else if(item->type() == SocEditPanelAddType) | ||
186 | { | ||
187 | int row = m_ref.get()->author.size(); | ||
188 | m_ref.get()->author.push_back("Anonymous"); | ||
189 | m_authors_list->insertRow(row); | ||
190 | QTableWidgetItem *item = new QTableWidgetItem( | ||
191 | QIcon::fromTheme("list-remove"), "", SocEditPanelDelType); | ||
192 | item->setFlags(Qt::ItemIsEnabled); | ||
193 | m_authors_list->setItem(row, 0, item); | ||
194 | item = new QTableWidgetItem(QString::fromStdString(m_ref.get()->author.back())); | ||
195 | m_authors_list->setItem(row, 1, item); | ||
196 | OnModified(); | ||
197 | } | ||
173 | } | 198 | } |
174 | 199 | ||
175 | void DevEditPanel::OnVersionEdited(const QString& text) | 200 | void SocEditPanel::OnAuthorChanged(QTableWidgetItem *item) |
176 | { | 201 | { |
177 | m_ref.GetDev().version = text.toStdString(); | 202 | if((size_t)item->row() >= m_ref.get()->author.size()) |
178 | OnModified(m_version_edit->isModified()); | 203 | return; |
204 | if(item->column() == 1) | ||
205 | m_ref.get()->author[item->row()] = item->text().toStdString(); | ||
206 | OnModified(); | ||
179 | } | 207 | } |
180 | 208 | ||
181 | void DevEditPanel::OnDescEdited() | 209 | /** |
210 | * NodeInstanceEditPanel | ||
211 | */ | ||
212 | |||
213 | namespace | ||
182 | { | 214 | { |
183 | m_ref.GetDev().desc = m_desc_edit->GetTextHtml().toStdString(); | 215 | |
184 | OnModified(m_desc_edit->IsModified()); | 216 | template< typename T > |
217 | soc_id_t GetFreshId(const std::vector< T >& list) | ||
218 | { | ||
219 | soc_id_t id = 0; | ||
220 | for(size_t i = 0; i < list.size(); i++) | ||
221 | id = std::max(id, list[i].id); | ||
222 | return id + 1; | ||
185 | } | 223 | } |
186 | 224 | ||
187 | void DevEditPanel::CreateNewRow(int row) | 225 | template< typename T > |
226 | int GetIndexById(const std::vector< T >& list, soc_id_t id) | ||
188 | { | 227 | { |
189 | QTableWidgetItem *item = new QTableWidgetItem(QIcon::fromTheme("list-add"), "", DevInstNewType); | 228 | for(size_t i = 0; i < list.size(); i++) |
190 | item->setToolTip("New?"); | 229 | if(list[i].id == id) |
191 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | 230 | return i; |
192 | m_instances_table->setItem(row, DevInstIconColumn, item); | 231 | return -1; |
193 | item = new QTableWidgetItem("New instance..."); | ||
194 | QFont font = item->font(); | ||
195 | font.setItalic(true); | ||
196 | item->setFont(font); | ||
197 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
198 | m_instances_table->setItem(row, DevInstNameColumn, item); | ||
199 | item = new QTableWidgetItem(""); | ||
200 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
201 | m_instances_table->setItem(row, DevInstAddrColumn, item); | ||
202 | } | 232 | } |
203 | 233 | ||
204 | void DevEditPanel::FillRow(int row, const soc_dev_addr_t& addr) | 234 | soc_desc::instance_t *GetInstanceById(const soc_desc::node_ref_t& node, soc_id_t id) |
205 | { | 235 | { |
206 | QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(addr.name)); | 236 | std::vector< soc_desc::instance_t >& inst_list = node.get()->instance; |
207 | item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); | 237 | for(size_t i = 0; i < inst_list.size(); i++) |
208 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | 238 | if(inst_list[i].id == id) |
209 | m_instances_table->setItem(row, DevInstNameColumn, item); | 239 | return &inst_list[i]; |
210 | item = new QTableWidgetItem(); | 240 | return 0; |
211 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | ||
212 | item->setData(Qt::DisplayRole, QVariant(addr.addr)); | ||
213 | m_instances_table->setItem(row, DevInstAddrColumn, item); | ||
214 | item = new QTableWidgetItem(QIcon::fromTheme("list-remove"), "", DevInstDeleteType); | ||
215 | item->setToolTip("Remove?"); | ||
216 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
217 | m_instances_table->setItem(row, DevInstIconColumn, item); | ||
218 | } | 241 | } |
219 | 242 | ||
220 | void DevEditPanel::OnInstActivated(int row, int column) | 243 | bool RemoveInstanceById(const soc_desc::node_ref_t& node, soc_id_t id) |
221 | { | 244 | { |
222 | if(column != 0) | 245 | std::vector< soc_desc::instance_t >& inst_list = node.get()->instance; |
223 | return; | 246 | for(size_t i = 0; i < inst_list.size(); i++) |
224 | int type = m_instances_table->item(row, column)->type(); | 247 | if(inst_list[i].id == id) |
225 | if(type == DevInstDeleteType) | 248 | { |
226 | { | 249 | my_remove_at(inst_list, i); |
227 | m_ref.GetDev().addr.erase(m_ref.GetDev().addr.begin() + row); | 250 | return true; |
228 | m_instances_table->removeRow(row); | 251 | } |
229 | OnModified(true); | 252 | return false; |
230 | } | ||
231 | else if(type == DevInstNewType) | ||
232 | { | ||
233 | m_instances_table->insertRow(row); | ||
234 | soc_dev_addr_t addr; | ||
235 | addr.name = QString("UNNAMED_%1").arg(row).toStdString(); | ||
236 | addr.addr = 0; | ||
237 | m_ref.GetDev().addr.push_back(addr); | ||
238 | FillRow(row, addr); | ||
239 | } | ||
240 | } | 253 | } |
241 | 254 | ||
242 | void DevEditPanel::OnInstChanged(int row, int column) | 255 | enum |
243 | { | 256 | { |
244 | /* ignore extra row for addition */ | 257 | InstTypeSingle, |
245 | if(row >= (int)m_ref.GetDev().addr.size()) | 258 | InstTypeRangeStride, |
246 | return; | 259 | InstTypeRangeFormula, |
247 | QTableWidgetItem *item = m_instances_table->item(row, column); | 260 | InstTypeRangeList |
248 | if(column == DevInstNameColumn) | 261 | }; |
262 | |||
263 | enum | ||
264 | { | ||
265 | NodeInstEditPanelDelType = QTableWidgetItem::UserType, | ||
266 | NodeInstEditPanelAddType | ||
267 | }; | ||
268 | |||
269 | } | ||
270 | |||
271 | NodeInstanceEditPanel::NodeInstanceEditPanel(const soc_desc::node_ref_t& ref, | ||
272 | soc_id_t inst_id, QWidget *parent) | ||
273 | :QWidget(parent), m_ref(ref), m_id(inst_id) | ||
274 | { | ||
275 | QLineEdit *name_edit = new QLineEdit(this); | ||
276 | QLineEdit *title_edit = new QLineEdit(this); | ||
277 | m_type_combo = new QComboBox(this); | ||
278 | QLabel *type_label = new QLabel("Type:", this); | ||
279 | QFont f = type_label->font(); | ||
280 | f.setBold(true); | ||
281 | type_label->setFont(f); | ||
282 | |||
283 | QHBoxLayout *type_layout = new QHBoxLayout; | ||
284 | type_layout->addWidget(type_label); | ||
285 | type_layout->addWidget(m_type_combo); | ||
286 | type_layout->addStretch(0); | ||
287 | |||
288 | soc_desc::field_t fake_field; | ||
289 | fake_field.pos = 0; | ||
290 | fake_field.width = 32; | ||
291 | |||
292 | m_single_group = new QWidget(this); | ||
293 | QHBoxLayout *sg_layout = new QHBoxLayout; | ||
294 | sg_layout->addWidget(new QLabel("Address:", m_single_group)); | ||
295 | SocFieldEditor *addr_edit = new SocFieldEditor(fake_field, m_single_group); | ||
296 | sg_layout->addWidget(addr_edit); | ||
297 | m_single_group->setLayout(sg_layout); | ||
298 | |||
299 | m_range_group = new QWidget(this); | ||
300 | QGridLayout *rg_layout = new QGridLayout; | ||
301 | rg_layout->addWidget(new QLabel("First:", m_range_group), 0, 0); | ||
302 | QSpinBox *first_spin = new QSpinBox(m_range_group); | ||
303 | rg_layout->addWidget(first_spin, 0, 1); | ||
304 | rg_layout->addWidget(new QLabel("Count:", m_range_group), 1, 0); | ||
305 | QSpinBox *count_spin = new QSpinBox(m_range_group); | ||
306 | rg_layout->addWidget(count_spin, 1, 1); | ||
307 | m_range_group->setLayout(rg_layout); | ||
308 | |||
309 | m_stride_group = new QWidget(m_range_group); | ||
310 | QGridLayout *rsg_layout = new QGridLayout; | ||
311 | rsg_layout->addWidget(new QLabel("Base:", m_stride_group), 0, 0); | ||
312 | SocFieldEditor *base_edit = new SocFieldEditor(fake_field, m_stride_group); | ||
313 | rsg_layout->addWidget(base_edit, 0, 1); | ||
314 | rsg_layout->addWidget(new QLabel("Stride:", m_stride_group), 1, 0); | ||
315 | SocFieldEditor *stride_edit = new SocFieldEditor(fake_field, m_stride_group); | ||
316 | rsg_layout->addWidget(stride_edit, 1, 1); | ||
317 | m_stride_group->setLayout(rsg_layout); | ||
318 | |||
319 | m_formula_group = new QWidget(m_range_group); | ||
320 | QGridLayout *fsg_layout = new QGridLayout; | ||
321 | fsg_layout->addWidget(new QLabel("Variable:", m_formula_group), 0, 0); | ||
322 | QLineEdit *variable_edit = new QLineEdit(m_formula_group); | ||
323 | fsg_layout->addWidget(variable_edit, 0, 1); | ||
324 | fsg_layout->addWidget(new QLabel("Formula:", m_formula_group), 1, 0); | ||
325 | QLineEdit *formula_edit = new QLineEdit(m_formula_group); | ||
326 | fsg_layout->addWidget(formula_edit, 1, 1); | ||
327 | m_formula_group->setLayout(fsg_layout); | ||
328 | |||
329 | QTableWidget *addr_list = new QTableWidget(m_range_group); | ||
330 | m_list_group = addr_list; | ||
331 | |||
332 | QHBoxLayout *inst_layout = new QHBoxLayout; | ||
333 | inst_layout->addWidget(m_single_group); | ||
334 | inst_layout->addWidget(m_range_group); | ||
335 | inst_layout->addWidget(m_stride_group); | ||
336 | inst_layout->addWidget(m_formula_group); | ||
337 | inst_layout->addWidget(m_list_group); | ||
338 | inst_layout->addStretch(0); | ||
339 | |||
340 | QGroupBox *inst_groupbox = new QGroupBox(this); | ||
341 | inst_groupbox->setLayout(inst_layout); | ||
342 | |||
343 | MyTextEditor *desc_edit = new MyTextEditor(this); | ||
344 | QVBoxLayout *ii_layout = new QVBoxLayout; | ||
345 | |||
346 | QFormLayout *info_layout = new QFormLayout(); | ||
347 | info_layout->addRow("Name", name_edit); | ||
348 | info_layout->addRow("Title", title_edit); | ||
349 | |||
350 | QGroupBox *info_group = Misc::EncloseInBox("Information", info_layout); | ||
351 | QGroupBox *desc_group = Misc::EncloseInBox("Description", desc_edit); | ||
352 | QHBoxLayout *name_title_desc_layout = new QHBoxLayout; | ||
353 | name_title_desc_layout->addWidget(info_group, 1); | ||
354 | name_title_desc_layout->addWidget(desc_group, 2); | ||
355 | |||
356 | ii_layout->addLayout(name_title_desc_layout); | ||
357 | ii_layout->addLayout(type_layout); | ||
358 | ii_layout->addWidget(inst_groupbox); | ||
359 | ii_layout->addStretch(1); | ||
360 | |||
361 | m_type_combo->addItem("Single", QVariant(InstTypeSingle)); | ||
362 | m_type_combo->addItem("Range > Stride", QVariant(InstTypeRangeStride)); | ||
363 | m_type_combo->addItem("Range > Formula", QVariant(InstTypeRangeFormula)); | ||
364 | m_type_combo->addItem("Range > List", QVariant(InstTypeRangeList)); | ||
365 | |||
366 | /* fill info */ | ||
367 | soc_desc::instance_t& inst = GetInstance(); | ||
368 | name_edit->setText(QString::fromStdString(inst.name)); | ||
369 | title_edit->setText(QString::fromStdString(inst.title)); | ||
370 | desc_edit->SetTextHtml(QString::fromStdString(inst.desc)); | ||
371 | addr_edit->setField(inst.addr); | ||
372 | base_edit->setField(inst.range.base); | ||
373 | stride_edit->setField(inst.range.stride); | ||
374 | first_spin->setValue(inst.range.first); | ||
375 | count_spin->setValue(inst.range.count); | ||
376 | formula_edit->setText(QString::fromStdString(inst.range.formula)); | ||
377 | variable_edit->setText(QString::fromStdString(inst.range.variable)); | ||
378 | addr_list->setColumnCount(2); | ||
379 | addr_list->setHorizontalHeaderItem(0, new QTableWidgetItem("")); | ||
380 | addr_list->setHorizontalHeaderItem(1, new QTableWidgetItem("Address")); | ||
381 | addr_list->horizontalHeader()->setVisible(false); | ||
382 | addr_list->verticalHeader()->setVisible(false); | ||
383 | addr_list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
384 | std::vector< soc_word_t >& addrs = inst.range.list; | ||
385 | addr_list->setRowCount(addrs.size() + 1); | ||
386 | for(size_t i = 0; i < addrs.size(); i++) | ||
249 | { | 387 | { |
250 | m_ref.GetDev().addr[row].name = item->text().toStdString(); | 388 | QTableWidgetItem *item = new QTableWidgetItem( |
251 | OnModified(true); | 389 | QIcon::fromTheme("list-remove"), "", NodeInstEditPanelDelType); |
390 | item->setFlags(Qt::ItemIsEnabled); | ||
391 | addr_list->setItem(i, 0, item); | ||
392 | item = new QTableWidgetItem(); | ||
393 | item->setData(Qt::EditRole, QVariant::fromValue(addrs[i])); | ||
394 | addr_list->setItem(i, 1, item); | ||
252 | } | 395 | } |
253 | else if(column == DevInstAddrColumn) | 396 | QTableWidgetItem *new_item = new QTableWidgetItem( |
397 | QIcon::fromTheme("list-add"), "", NodeInstEditPanelAddType); | ||
398 | new_item->setFlags(Qt::ItemIsEnabled); | ||
399 | addr_list->setItem(addrs.size(), 0, new_item); | ||
400 | new_item = new QTableWidgetItem("New address...", QTableWidgetItem::UserType); | ||
401 | new_item->setFlags(Qt::ItemIsEnabled); | ||
402 | QFont font = new_item->font(); | ||
403 | font.setItalic(true); | ||
404 | new_item->setFont(font); | ||
405 | addr_list->setItem(addrs.size(), 1, new_item); | ||
406 | addr_list->resizeColumnsToContents(); | ||
407 | addr_list->horizontalHeader()->setStretchLastSection(true); | ||
408 | m_table_delegate = new SocFieldItemDelegate(this); | ||
409 | m_table_delegate->setItemEditorFactory(new QItemEditorFactory); | ||
410 | m_table_edit_factory = new SocFieldEditorCreator; | ||
411 | m_table_delegate->itemEditorFactory()->registerEditor(QVariant::UInt, m_table_edit_factory); | ||
412 | addr_list->setItemDelegate(m_table_delegate); | ||
413 | |||
414 | setLayout(ii_layout); | ||
415 | |||
416 | connect(name_edit, SIGNAL(textChanged(const QString&)), this, | ||
417 | SLOT(OnNameEdited(const QString&))); | ||
418 | connect(desc_edit, SIGNAL(OnTextChanged(const QString&)), this, | ||
419 | SLOT(OnDescEdited(const QString&))); | ||
420 | connect(title_edit, SIGNAL(textChanged(const QString&)), this, | ||
421 | SLOT(OnTitleEdited(const QString&))); | ||
422 | connect(addr_edit, SIGNAL(editingFinished(uint)), this, SLOT(OnAddrChanged(uint))); | ||
423 | connect(base_edit, SIGNAL(editingFinished(uint)), this, SLOT(OnBaseChanged(uint))); | ||
424 | connect(stride_edit, SIGNAL(editingFinished(uint)), this, SLOT(OnStrideChanged(uint))); | ||
425 | connect(first_spin, SIGNAL(valueChanged(int)), this, SLOT(OnFirstChanged(int))); | ||
426 | connect(count_spin, SIGNAL(valueChanged(int)), this, SLOT(OnCountChanged(int))); | ||
427 | connect(formula_edit, SIGNAL(textChanged(const QString&)), this, | ||
428 | SLOT(OnFormulaChanged(const QString&))); | ||
429 | connect(variable_edit, SIGNAL(textChanged(const QString&)), this, | ||
430 | SLOT(OnVariableChanged(const QString&))); | ||
431 | connect(m_type_combo, SIGNAL(currentIndexChanged(int)), | ||
432 | this, SLOT(OnTypeChanged(int))); | ||
433 | connect(addr_list, SIGNAL(itemActivated(QTableWidgetItem *)), this, | ||
434 | SLOT(OnAddressActivated(QTableWidgetItem *))); | ||
435 | connect(addr_list, SIGNAL(itemChanged(QTableWidgetItem *)), this, | ||
436 | SLOT(OnAddressChanged(QTableWidgetItem *))); | ||
437 | |||
438 | /* fill info */ | ||
439 | int combo_type; | ||
440 | if(inst.type == soc_desc::instance_t::RANGE) | ||
254 | { | 441 | { |
255 | m_ref.GetDev().addr[row].addr = item->data(Qt::DisplayRole).toUInt(); | 442 | if(inst.range.type == soc_desc::range_t::STRIDE) |
256 | OnModified(true); | 443 | combo_type = InstTypeRangeStride; |
444 | else if(inst.range.type == soc_desc::range_t::FORMULA) | ||
445 | combo_type = InstTypeRangeFormula; | ||
446 | else /* LIST */ | ||
447 | combo_type = InstTypeRangeList; | ||
257 | } | 448 | } |
449 | else | ||
450 | combo_type = InstTypeSingle; | ||
451 | m_type_combo->setCurrentIndex(m_type_combo->findData(QVariant(combo_type))); | ||
452 | UpdateType(combo_type); | ||
258 | } | 453 | } |
259 | 454 | ||
260 | /** | 455 | soc_desc::instance_t& NodeInstanceEditPanel::GetInstance() |
261 | * RegEditPanel | 456 | { |
262 | */ | 457 | return *GetInstanceById(m_ref, m_id); |
458 | } | ||
263 | 459 | ||
264 | RegEditPanel::RegEditPanel(SocRegRef ref, QWidget *parent) | 460 | void NodeInstanceEditPanel::OnNameEdited(const QString& text) |
265 | :QWidget(parent), m_ref(ref), m_reg_font(font()) | ||
266 | { | 461 | { |
267 | m_reg_font.setWeight(100); | 462 | GetInstance().name = text.toStdString(); |
268 | m_reg_font.setKerning(false); | 463 | OnModified(); |
464 | } | ||
269 | 465 | ||
270 | m_name_group = new QGroupBox("Name", this); | 466 | void NodeInstanceEditPanel::OnTitleEdited(const QString& text) |
271 | m_name_edit = new QLineEdit(this); | 467 | { |
272 | m_name_edit->setText(QString::fromStdString(ref.GetReg().name)); | 468 | GetInstance().title = text.toStdString(); |
273 | QVBoxLayout *name_group_layout = new QVBoxLayout; | 469 | OnModified(); |
274 | name_group_layout->addWidget(m_name_edit); | 470 | } |
275 | m_name_group->setLayout(name_group_layout); | ||
276 | |||
277 | m_instances_table = new QTableWidget(this); | ||
278 | m_instances_table->setRowCount(ref.GetReg().addr.size() + 1); | ||
279 | m_instances_table->setColumnCount(RegInstNrColumns); | ||
280 | for(size_t row = 0; row < ref.GetReg().addr.size(); row++) | ||
281 | FillRow(row, ref.GetReg().addr[row]); | ||
282 | CreateNewAddrRow(ref.GetReg().addr.size()); | ||
283 | m_instances_table->setHorizontalHeaderItem(RegInstIconColumn, new QTableWidgetItem("")); | ||
284 | m_instances_table->setHorizontalHeaderItem(RegInstNameColumn, new QTableWidgetItem("Name")); | ||
285 | m_instances_table->setHorizontalHeaderItem(RegInstAddrColumn, new QTableWidgetItem("Address")); | ||
286 | m_instances_table->verticalHeader()->setVisible(false); | ||
287 | m_instances_table->resizeColumnsToContents(); | ||
288 | m_instances_table->horizontalHeader()->setStretchLastSection(true); | ||
289 | m_instances_table->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); | ||
290 | m_instances_group = new QGroupBox("Instances", this); | ||
291 | QHBoxLayout *instances_group_layout = new QHBoxLayout; | ||
292 | instances_group_layout->addWidget(m_instances_table); | ||
293 | m_instances_group->setLayout(instances_group_layout); | ||
294 | |||
295 | m_desc_group = new QGroupBox("Description", this); | ||
296 | QHBoxLayout *group_layout = new QHBoxLayout; | ||
297 | m_desc_edit = new MyTextEditor(this); | ||
298 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetReg().desc)); | ||
299 | group_layout->addWidget(m_desc_edit); | ||
300 | m_desc_group->setLayout(group_layout); | ||
301 | |||
302 | bool has_sct = m_ref.GetReg().flags & REG_HAS_SCT; | ||
303 | m_sct_check = new QCheckBox("Set/Clear/Toggle", this); | ||
304 | m_sct_check->setCheckState(has_sct ? Qt::Checked : Qt::Unchecked); | ||
305 | QHBoxLayout *flags_layout = new QHBoxLayout; | ||
306 | flags_layout->addWidget(m_sct_check); | ||
307 | flags_layout->addStretch(); | ||
308 | m_flags_group = new QGroupBox("Flags", this); | ||
309 | m_flags_group->setLayout(flags_layout); | ||
310 | |||
311 | m_formula_combo = new QComboBox(this); | ||
312 | m_formula_combo->addItem("None", QVariant(REG_FORMULA_NONE)); | ||
313 | m_formula_combo->addItem("String", QVariant(REG_FORMULA_STRING)); | ||
314 | m_formula_combo->setCurrentIndex(m_formula_combo->findData(QVariant(m_ref.GetReg().formula.type))); | ||
315 | m_formula_type_label = new QLabel("Type:", this); | ||
316 | QHBoxLayout *formula_top_layout = new QHBoxLayout; | ||
317 | formula_top_layout->addWidget(m_formula_type_label); | ||
318 | formula_top_layout->addWidget(m_formula_combo); | ||
319 | m_formula_string_edit = new QLineEdit(QString::fromStdString(ref.GetReg().formula.string), this); | ||
320 | QVBoxLayout *formula_layout = new QVBoxLayout; | ||
321 | formula_layout->addLayout(formula_top_layout); | ||
322 | formula_layout->addWidget(m_formula_string_edit); | ||
323 | m_formula_string_gen = new QPushButton("Generate", this); | ||
324 | formula_layout->addWidget(m_formula_string_gen); | ||
325 | m_formula_group = new QGroupBox("Formula", this); | ||
326 | m_formula_group->setLayout(formula_layout); | ||
327 | |||
328 | QVBoxLayout *name_layout = new QVBoxLayout; | ||
329 | name_layout->addWidget(m_name_group); | ||
330 | name_layout->addWidget(m_flags_group); | ||
331 | name_layout->addWidget(m_formula_group); | ||
332 | name_layout->addStretch(); | ||
333 | |||
334 | QHBoxLayout *top_layout = new QHBoxLayout; | ||
335 | top_layout->addWidget(m_instances_group); | ||
336 | top_layout->addLayout(name_layout); | ||
337 | top_layout->addWidget(m_desc_group, 1); | ||
338 | |||
339 | m_value_table = new QTableView(this); | ||
340 | m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership | ||
341 | m_value_model->SetRegister(m_ref.GetReg()); | ||
342 | m_value_model->SetReadOnly(true); | ||
343 | m_value_table->setModel(m_value_model); | ||
344 | m_value_table->verticalHeader()->setVisible(false); | ||
345 | m_value_table->horizontalHeader()->setStretchLastSection(true); | ||
346 | m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
347 | // FIXME we cannot use setAlternatingRowColors() because we override the | ||
348 | // background color, should it be part of the model ? | ||
349 | m_table_delegate = new SocFieldCachedItemDelegate(this); | ||
350 | m_value_table->setItemDelegate(m_table_delegate); | ||
351 | m_value_table->resizeColumnsToContents(); | ||
352 | |||
353 | m_sexy_display2 = new Unscroll<RegSexyDisplay2>(this); | ||
354 | m_sexy_display2->setFont(m_reg_font); | ||
355 | m_sexy_display2->setModel(m_value_model); | ||
356 | m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
357 | 471 | ||
358 | QHBoxLayout *field_layout = new QHBoxLayout; | 472 | void NodeInstanceEditPanel::OnDescEdited(const QString& text) |
359 | field_layout->addWidget(m_value_table); | 473 | { |
360 | m_field_group = new QGroupBox("Flags", this); | 474 | GetInstance().desc = text.toStdString(); |
361 | m_field_group->setLayout(field_layout); | 475 | OnModified(); |
476 | } | ||
362 | 477 | ||
363 | QVBoxLayout *layout = new QVBoxLayout; | 478 | void NodeInstanceEditPanel::OnAddrChanged(uint addr) |
364 | layout->addLayout(top_layout, 0); | 479 | { |
365 | layout->addWidget(m_sexy_display2, 0); | 480 | GetInstance().addr = addr; |
366 | layout->addWidget(m_field_group); | 481 | OnModified(); |
482 | } | ||
367 | 483 | ||
368 | UpdateFormula(); | 484 | void NodeInstanceEditPanel::OnBaseChanged(uint base) |
485 | { | ||
486 | GetInstance().range.base = base; | ||
487 | OnModified(); | ||
488 | } | ||
369 | 489 | ||
370 | setLayout(layout); | 490 | void NodeInstanceEditPanel::OnStrideChanged(uint stride) |
491 | { | ||
492 | GetInstance().range.stride = stride; | ||
493 | OnModified(); | ||
494 | } | ||
371 | 495 | ||
372 | SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(this); | 496 | void NodeInstanceEditPanel::OnFirstChanged(int first) |
373 | QItemEditorFactory *m_table_edit_factory = new QItemEditorFactory(); | 497 | { |
374 | SocFieldEditorCreator *m_table_edit_creator = new SocFieldEditorCreator(); | 498 | GetInstance().range.first = first; |
375 | m_table_edit_factory->registerEditor(QVariant::UInt, m_table_edit_creator); | 499 | OnModified(); |
376 | m_table_delegate->setItemEditorFactory(m_table_edit_factory); | 500 | } |
377 | m_instances_table->setItemDelegate(m_table_delegate); | ||
378 | 501 | ||
379 | connect(m_instances_table, SIGNAL(cellActivated(int,int)), this, SLOT(OnInstActivated(int,int))); | 502 | void NodeInstanceEditPanel::OnCountChanged(int count) |
380 | connect(m_instances_table, SIGNAL(cellChanged(int,int)), this, SLOT(OnInstChanged(int,int))); | 503 | { |
381 | connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&))); | 504 | GetInstance().range.count = count; |
382 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited())); | 505 | OnModified(); |
383 | connect(m_sct_check, SIGNAL(stateChanged(int)), this, SLOT(OnSctEdited(int))); | ||
384 | connect(m_formula_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(OnFormulaChanged(int))); | ||
385 | connect(m_formula_string_edit, SIGNAL(textChanged(const QString&)), this, | ||
386 | SLOT(OnFormulaStringChanged(const QString&))); | ||
387 | connect(m_formula_string_gen, SIGNAL(clicked(bool)), this, SLOT(OnFormulaGenerate(bool))); | ||
388 | } | 506 | } |
389 | 507 | ||
390 | void RegEditPanel::UpdateWarning(int row) | 508 | void NodeInstanceEditPanel::OnFormulaChanged(const QString& formula) |
391 | { | 509 | { |
392 | Q_UNUSED(row); | 510 | GetInstance().range.formula = formula.toStdString(); |
511 | OnModified(); | ||
393 | } | 512 | } |
394 | 513 | ||
395 | void RegEditPanel::OnFormulaStringChanged(const QString& text) | 514 | void NodeInstanceEditPanel::OnVariableChanged(const QString& variable) |
396 | { | 515 | { |
397 | m_ref.GetReg().formula.string = text.toStdString(); | 516 | GetInstance().range.variable = variable.toStdString(); |
398 | OnModified(true); | 517 | OnModified(); |
399 | } | 518 | } |
400 | 519 | ||
401 | void RegEditPanel::OnFormulaGenerate(bool checked) | 520 | void NodeInstanceEditPanel::OnAddressActivated(QTableWidgetItem *item) |
402 | { | 521 | { |
403 | Q_UNUSED(checked); | 522 | QTableWidget *table = item->tableWidget(); |
404 | bool ok; | 523 | soc_desc::instance_t& inst = GetInstance(); |
405 | int count = QInputDialog::getInt(this, "Instance generator", "Number of instances", | 524 | if(item->type() == NodeInstEditPanelDelType) |
406 | 0, 0, 100, 1, &ok); | ||
407 | if(!ok) | ||
408 | return; | ||
409 | std::string name(m_ref.GetReg().name); | ||
410 | size_t pos = name.find('n'); | ||
411 | if(pos == std::string::npos) | ||
412 | { | ||
413 | name.push_back('n'); | ||
414 | pos = name.size() - 1; | ||
415 | } | ||
416 | std::map< std::string, soc_word_t > map; | ||
417 | std::vector< std::pair< std::string, soc_word_t > > list; | ||
418 | std::string formula = m_ref.GetReg().formula.string; | ||
419 | for(int n = 0; n < count; n++) | ||
420 | { | 525 | { |
421 | map["n"] = n; | 526 | int row = item->row(); |
422 | std::string err; | 527 | my_remove_at(inst.range.list, row); |
423 | soc_word_t res; | 528 | table->removeRow(row); |
424 | if(!evaluate_formula(formula, map, res, err)) | 529 | OnModified(); |
425 | { | ||
426 | qDebug() << "Cannot evaluator " << QString::fromStdString(formula) | ||
427 | << "for n=" << n << ": " << QString::fromStdString(err); | ||
428 | return; | ||
429 | } | ||
430 | std::string regname = name; | ||
431 | std::string strn = QString("%1").arg(n).toStdString(); | ||
432 | regname.replace(pos, 1, strn); | ||
433 | list.push_back(std::make_pair(regname, res)); | ||
434 | } | 530 | } |
435 | // everything went good, commit result | 531 | else if(item->type() == NodeInstEditPanelAddType) |
436 | while(m_instances_table->rowCount() > 1) | ||
437 | m_instances_table->removeRow(0); | ||
438 | m_ref.GetReg().addr.resize(list.size()); | ||
439 | for(size_t i = 0; i < list.size(); i++) | ||
440 | { | 532 | { |
441 | m_instances_table->insertRow(i); | 533 | int row = inst.range.list.size(); |
442 | m_ref.GetReg().addr[i].name = list[i].first; | 534 | soc_word_t new_addr = 0; |
443 | m_ref.GetReg().addr[i].addr = list[i].second; | 535 | GetInstance().range.list.push_back(new_addr); |
444 | FillRow(i, m_ref.GetReg().addr[i]); | 536 | table->insertRow(row); |
537 | QTableWidgetItem *item = new QTableWidgetItem( | ||
538 | QIcon::fromTheme("list-remove"), "", NodeInstEditPanelDelType); | ||
539 | item->setFlags(Qt::ItemIsEnabled); | ||
540 | table->setItem(row, 0, item); | ||
541 | item = new QTableWidgetItem(); | ||
542 | item->setData(Qt::EditRole, QVariant(new_addr)); | ||
543 | table->setItem(row, 1, item); | ||
544 | OnModified(); | ||
445 | } | 545 | } |
446 | } | 546 | } |
447 | 547 | ||
448 | void RegEditPanel::OnFormulaChanged(int index) | 548 | void NodeInstanceEditPanel::OnAddressChanged(QTableWidgetItem *item) |
449 | { | 549 | { |
450 | if(index == -1) | 550 | soc_desc::instance_t& inst = GetInstance(); |
551 | if((size_t)item->row() >= inst.range.list.size()) | ||
451 | return; | 552 | return; |
452 | m_ref.GetReg().formula.type = static_cast< soc_reg_formula_type_t >(m_formula_combo->itemData(index).toInt()); | 553 | soc_word_t& addr = inst.range.list[item->row()]; |
453 | UpdateFormula(); | 554 | if(item->column() == 1) |
454 | OnModified(true); | 555 | addr = item->data(Qt::EditRole).value< soc_word_t >(); |
556 | OnModified(); | ||
455 | } | 557 | } |
456 | 558 | ||
457 | void RegEditPanel::UpdateFormula() | 559 | void NodeInstanceEditPanel::UpdateType(int type) |
458 | { | 560 | { |
459 | m_formula_string_edit->hide(); | 561 | m_single_group->hide(); |
460 | m_formula_string_gen->hide(); | 562 | m_range_group->hide(); |
461 | switch(m_ref.GetReg().formula.type) | 563 | m_stride_group->hide(); |
564 | m_formula_group->hide(); | ||
565 | m_list_group->hide(); | ||
566 | |||
567 | switch(type) | ||
462 | { | 568 | { |
463 | case REG_FORMULA_STRING: | 569 | case InstTypeSingle: |
464 | m_formula_string_edit->show(); | 570 | m_single_group->show(); |
465 | m_formula_string_gen->show(); | 571 | GetInstance().type = soc_desc::instance_t::SINGLE; |
572 | break; | ||
573 | case InstTypeRangeStride: | ||
574 | m_range_group->show(); | ||
575 | m_stride_group->show(); | ||
576 | GetInstance().type = soc_desc::instance_t::RANGE; | ||
577 | GetInstance().range.type = soc_desc::range_t::STRIDE; | ||
578 | break; | ||
579 | case InstTypeRangeFormula: | ||
580 | m_range_group->show(); | ||
581 | m_formula_group->show(); | ||
582 | GetInstance().type = soc_desc::instance_t::RANGE; | ||
583 | GetInstance().range.type = soc_desc::range_t::FORMULA; | ||
584 | break; | ||
585 | case InstTypeRangeList: | ||
586 | m_range_group->show(); | ||
587 | m_formula_group->hide(); | ||
588 | m_list_group->show(); | ||
589 | GetInstance().type = soc_desc::instance_t::RANGE; | ||
590 | GetInstance().range.type = soc_desc::range_t::LIST; | ||
466 | break; | 591 | break; |
467 | case REG_FORMULA_NONE: | ||
468 | default: | 592 | default: |
469 | break; | 593 | break; |
470 | } | 594 | } |
471 | } | 595 | } |
472 | 596 | ||
473 | void RegEditPanel::OnSctEdited(int state) | 597 | void NodeInstanceEditPanel::OnTypeChanged(int index) |
474 | { | 598 | { |
475 | if(state == Qt::Checked) | 599 | if(index == -1) |
476 | m_ref.GetReg().flags |= REG_HAS_SCT; | 600 | return; |
477 | else | 601 | UpdateType(m_type_combo->itemData(index).toInt()); |
478 | m_ref.GetReg().flags &= ~REG_HAS_SCT; | 602 | OnModified(); |
479 | OnModified(true); | ||
480 | } | ||
481 | |||
482 | void RegEditPanel::FillRow(int row, const soc_reg_addr_t& addr) | ||
483 | { | ||
484 | QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(addr.name)); | ||
485 | item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); | ||
486 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | ||
487 | m_instances_table->setItem(row, RegInstNameColumn, item); | ||
488 | item = new QTableWidgetItem(); | ||
489 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | ||
490 | item->setData(Qt::DisplayRole, QVariant(addr.addr)); | ||
491 | m_instances_table->setItem(row, RegInstAddrColumn, item); | ||
492 | item = new QTableWidgetItem(QIcon::fromTheme("list-remove"), "", RegInstDeleteType); | ||
493 | item->setToolTip("Remove?"); | ||
494 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
495 | m_instances_table->setItem(row, RegInstIconColumn, item); | ||
496 | } | ||
497 | |||
498 | void RegEditPanel::CreateNewAddrRow(int row) | ||
499 | { | ||
500 | QTableWidgetItem *item = new QTableWidgetItem(QIcon::fromTheme("list-add"), "", RegInstNewType); | ||
501 | item->setToolTip("New?"); | ||
502 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
503 | m_instances_table->setItem(row, RegInstIconColumn, item); | ||
504 | item = new QTableWidgetItem("New instance..."); | ||
505 | QFont font = item->font(); | ||
506 | font.setItalic(true); | ||
507 | item->setFont(font); | ||
508 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
509 | m_instances_table->setItem(row, RegInstNameColumn, item); | ||
510 | item = new QTableWidgetItem(""); | ||
511 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
512 | m_instances_table->setItem(row, RegInstAddrColumn, item); | ||
513 | } | 603 | } |
514 | 604 | ||
515 | void RegEditPanel::OnNameEdited(const QString& text) | 605 | soc_id_t NodeInstanceEditPanel::GetId() |
516 | { | 606 | { |
517 | m_ref.GetReg().name = text.toStdString(); | 607 | return m_id; |
518 | OnModified(m_name_edit->isModified()); | ||
519 | } | 608 | } |
520 | 609 | ||
521 | void RegEditPanel::OnDescEdited() | 610 | /** |
522 | { | 611 | * NodeEditPanel |
523 | m_ref.GetReg().desc = m_desc_edit->GetTextHtml().toStdString(); | 612 | */ |
524 | OnModified(m_desc_edit->IsModified()); | ||
525 | } | ||
526 | 613 | ||
527 | void RegEditPanel::OnInstActivated(int row, int column) | 614 | NodeEditPanel::NodeEditPanel(const soc_desc::node_ref_t& ref, QWidget *parent) |
615 | :QWidget(parent), m_ref(ref) | ||
528 | { | 616 | { |
529 | if(column != 0) | 617 | /* top layout: name, title then desc */ |
530 | return; | 618 | QLineEdit *name_edit = new QLineEdit(this); |
531 | int type = m_instances_table->item(row, column)->type(); | 619 | name_edit->setText(QString::fromStdString(ref.get()->name)); |
532 | if(type == RegInstDeleteType) | 620 | |
533 | { | 621 | QLineEdit *title_edit = new QLineEdit(this); |
534 | m_ref.GetReg().addr.erase(m_ref.GetReg().addr.begin() + row); | 622 | title_edit->setText(QString::fromStdString(ref.get()->title)); |
535 | m_instances_table->removeRow(row); | 623 | |
536 | OnModified(true); | 624 | QFormLayout *info_layout = new QFormLayout(); |
537 | } | 625 | info_layout->addRow("Name", name_edit); |
538 | else if(type == RegInstNewType) | 626 | info_layout->addRow("Title", title_edit); |
627 | |||
628 | QGroupBox *info_group = Misc::EncloseInBox("Information", info_layout); | ||
629 | |||
630 | m_desc_edit = new MyTextEditor(this); | ||
631 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.get()->desc)); | ||
632 | QGroupBox *desc_group = Misc::EncloseInBox("Description", m_desc_edit); | ||
633 | |||
634 | QHBoxLayout *name_title_desc_layout = new QHBoxLayout; | ||
635 | name_title_desc_layout->addWidget(info_group, 1); | ||
636 | name_title_desc_layout->addWidget(desc_group, 2); | ||
637 | |||
638 | /* instance tab */ | ||
639 | m_instances_tab = new YTabWidget(0, this); | ||
640 | m_instances_tab->setTabOpenable(true); | ||
641 | std::vector< soc_desc::instance_t >& inst_list = m_ref.get()->instance; | ||
642 | m_instances_tab->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); | ||
643 | m_instances_tab->setTabsClosable(true); | ||
644 | QGroupBox *instance_tab_group = Misc::EncloseInBox("Instances", m_instances_tab); | ||
645 | for(size_t i = 0; i < inst_list.size(); i++) | ||
539 | { | 646 | { |
540 | m_instances_table->insertRow(row); | 647 | NodeInstanceEditPanel *p = new NodeInstanceEditPanel(m_ref, inst_list[i].id, this); |
541 | soc_reg_addr_t addr; | 648 | connect(p, SIGNAL(OnModified()), this, SLOT(OnInstModified())); |
542 | addr.name = QString("UNNAMED_%1").arg(row).toStdString(); | 649 | m_instances_tab->addTab(p, QString::fromStdString(inst_list[i].name)); |
543 | addr.addr = 0; | ||
544 | m_ref.GetReg().addr.push_back(addr); | ||
545 | FillRow(row, addr); | ||
546 | } | 650 | } |
651 | |||
652 | /* boring */ | ||
653 | QVBoxLayout *layout = new QVBoxLayout; | ||
654 | layout->addLayout(name_title_desc_layout); | ||
655 | layout->addWidget(instance_tab_group); | ||
656 | layout->addStretch(1); | ||
657 | |||
658 | setLayout(layout); | ||
659 | |||
660 | connect(name_edit, SIGNAL(textChanged(const QString&)), this, | ||
661 | SLOT(OnNameEdited(const QString&))); | ||
662 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited())); | ||
663 | connect(title_edit, SIGNAL(textChanged(const QString&)), this, | ||
664 | SLOT(OnTitleEdited(const QString&))); | ||
665 | connect(m_instances_tab, SIGNAL(tabCloseRequested(int)), this, | ||
666 | SLOT(OnInstRemove(int))); | ||
667 | connect(m_instances_tab, SIGNAL(tabOpenRequested()), this, SLOT(OnInstCreate())); | ||
547 | } | 668 | } |
548 | 669 | ||
549 | void RegEditPanel::OnInstChanged(int row, int column) | 670 | void NodeEditPanel::OnNameEdited(const QString& text) |
550 | { | 671 | { |
551 | /* ignore extra row for addition */ | 672 | m_ref.get()->name = text.toStdString(); |
552 | if(row >= (int)m_ref.GetReg().addr.size()) | 673 | OnModified(); |
553 | return; | 674 | } |
554 | QTableWidgetItem *item = m_instances_table->item(row, column); | 675 | |
555 | if(column == RegInstNameColumn) | 676 | void NodeEditPanel::OnTitleEdited(const QString& text) |
556 | { | 677 | { |
557 | m_ref.GetReg().addr[row].name = item->text().toStdString(); | 678 | m_ref.get()->title = text.toStdString(); |
558 | OnModified(true); | 679 | OnModified(); |
559 | } | 680 | } |
560 | else if(column == RegInstAddrColumn) | 681 | |
682 | void NodeEditPanel::OnDescEdited() | ||
683 | { | ||
684 | m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString(); | ||
685 | OnModified(); | ||
686 | } | ||
687 | |||
688 | void NodeEditPanel::OnInstRemove(int index) | ||
689 | { | ||
690 | NodeInstanceEditPanel *panel = | ||
691 | dynamic_cast< NodeInstanceEditPanel * >(m_instances_tab->widget(index)); | ||
692 | RemoveInstanceById(m_ref, panel->GetId()); | ||
693 | m_instances_tab->removeTab(index); | ||
694 | delete panel; | ||
695 | OnModified(); | ||
696 | } | ||
697 | |||
698 | void NodeEditPanel::OnInstModified() | ||
699 | { | ||
700 | int index = m_instances_tab->currentIndex(); | ||
701 | NodeInstanceEditPanel *panel = | ||
702 | dynamic_cast< NodeInstanceEditPanel * >(m_instances_tab->widget(index)); | ||
703 | m_instances_tab->setTabText(index, QString::fromStdString(panel->GetInstance().name)); | ||
704 | OnModified(); | ||
705 | } | ||
706 | |||
707 | QString NodeEditPanel::GuessName() | ||
708 | { | ||
709 | /* try to find instances named Xddd where X is the node name (case insensitive) | ||
710 | * and d are digits. */ | ||
711 | int max_nr_digits = -1; | ||
712 | int max_value = -1; | ||
713 | QString node_name = QString::fromStdString(m_ref.get()->name); | ||
714 | std::vector< soc_desc::instance_t >& inst_list = m_ref.get()->instance; | ||
715 | for(size_t i = 0; i < inst_list.size(); i++) | ||
561 | { | 716 | { |
562 | m_ref.GetReg().addr[row].addr = item->data(Qt::DisplayRole).toUInt(); | 717 | QString inst_name = QString::fromStdString(inst_list[i].name); |
563 | OnModified(true); | 718 | /* ignore name if it doesn't start like the node name */ |
719 | if(!inst_name.startsWith(node_name, Qt::CaseInsensitive)) | ||
720 | continue; | ||
721 | /* check if the suffix is a digit */ | ||
722 | QString suffix = inst_name.mid(node_name.size()); | ||
723 | if(suffix.size() == 0) | ||
724 | { | ||
725 | max_nr_digits = qMax(max_nr_digits, 0); | ||
726 | continue; | ||
727 | } | ||
728 | bool ok; | ||
729 | int value = suffix.toUInt(&ok); | ||
730 | if(!ok) | ||
731 | continue; | ||
732 | max_value = qMax(max_value, value); | ||
733 | max_nr_digits = qMax(max_nr_digits, suffix.size()); | ||
564 | } | 734 | } |
735 | /* if no match, use node name */ | ||
736 | if(max_nr_digits == -1) | ||
737 | return node_name; | ||
738 | /* match of size 0, add "1" at the end */ | ||
739 | if(max_nr_digits == 0) | ||
740 | return node_name + "1"; | ||
741 | /* otherwise, pick next value */ | ||
742 | return QString("%1%2").arg(node_name) | ||
743 | .arg(max_value + 1, max_nr_digits, 10, QChar('0')); | ||
744 | } | ||
745 | |||
746 | void NodeEditPanel::OnInstCreate() | ||
747 | { | ||
748 | std::vector< soc_desc::instance_t >& inst_list = m_ref.get()->instance; | ||
749 | soc_desc::instance_t inst; | ||
750 | inst.id = GetFreshId(inst_list); | ||
751 | inst.name = GuessName().toStdString(); | ||
752 | inst.type = soc_desc::instance_t::SINGLE; | ||
753 | inst.addr = 0; | ||
754 | inst.range.type = soc_desc::range_t::STRIDE; | ||
755 | inst.range.first = 0; | ||
756 | inst.range.count = 0; | ||
757 | inst.range.stride = 0; | ||
758 | inst_list.push_back(inst); | ||
759 | NodeInstanceEditPanel *p = new NodeInstanceEditPanel(m_ref, inst.id, this); | ||
760 | connect(p, SIGNAL(OnModified()), this, SLOT(OnInstModified())); | ||
761 | int idx = m_instances_tab->addTab(p, QString::fromStdString(inst.name)); | ||
762 | m_instances_tab->setCurrentIndex(idx); | ||
763 | OnModified(); | ||
565 | } | 764 | } |
566 | 765 | ||
567 | /** | 766 | /** |
568 | * FieldEditPanel | 767 | * RegFieldEditPanel |
569 | */ | 768 | */ |
570 | FieldEditPanel::FieldEditPanel(SocFieldRef ref, QWidget *parent) | 769 | |
770 | namespace | ||
771 | { | ||
772 | |||
773 | enum | ||
774 | { | ||
775 | RegFieldEditPanelDelType = QTableWidgetItem::UserType, | ||
776 | RegFieldEditPanelAddType, | ||
777 | }; | ||
778 | |||
779 | } | ||
780 | |||
781 | RegFieldEditPanel::RegFieldEditPanel(const soc_desc::field_ref_t& ref, QWidget *parent) | ||
571 | :QWidget(parent), m_ref(ref) | 782 | :QWidget(parent), m_ref(ref) |
572 | { | 783 | { |
573 | m_name_group = new QGroupBox("Name", this); | ||
574 | m_name_edit = new QLineEdit(this); | 784 | m_name_edit = new QLineEdit(this); |
575 | m_name_edit->setText(QString::fromStdString(ref.GetField().name)); | 785 | m_range_edit = new QLineEdit(this); |
576 | QVBoxLayout *name_group_layout = new QVBoxLayout; | 786 | m_range_validator = new SocBitRangeValidator(this); |
577 | name_group_layout->addWidget(m_name_edit); | 787 | m_range_validator->setWidth(m_ref.reg().get()->width); |
578 | m_name_group->setLayout(name_group_layout); | 788 | m_range_edit->setValidator(m_range_validator); |
579 | |||
580 | m_bitrange_group = new QGroupBox("Bit Range", this); | ||
581 | m_bitrange_edit = new QLineEdit(this); | ||
582 | const soc_reg_field_t& field = ref.GetField(); | ||
583 | QString bits_str; | ||
584 | if(field.first_bit == field.last_bit) | ||
585 | bits_str.sprintf("%d", field.first_bit); | ||
586 | else | ||
587 | bits_str.sprintf("%d:%d", field.last_bit, field.first_bit); | ||
588 | m_bitrange_edit->setText(bits_str); | ||
589 | m_bitrange_edit->setValidator(new SocBitRangeValidator(m_bitrange_edit)); | ||
590 | QVBoxLayout *bitrange_group_layout = new QVBoxLayout; | ||
591 | bitrange_group_layout->addWidget(m_bitrange_edit); | ||
592 | m_bitrange_group->setLayout(bitrange_group_layout); | ||
593 | |||
594 | m_desc_group = new QGroupBox("Description", this); | ||
595 | QHBoxLayout *group_layout = new QHBoxLayout; | ||
596 | m_desc_edit = new MyTextEditor(this); | 789 | m_desc_edit = new MyTextEditor(this); |
597 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetField().desc)); | 790 | QHBoxLayout *namepos_layout = new QHBoxLayout; |
598 | group_layout->addWidget(m_desc_edit); | 791 | namepos_layout->addWidget(new QLabel("Name:")); |
599 | m_desc_group->setLayout(group_layout); | 792 | namepos_layout->addWidget(m_name_edit); |
600 | 793 | namepos_layout->addWidget(new QLabel("Range:")); | |
601 | m_value_group = new QGroupBox("Values", this); | 794 | namepos_layout->addWidget(m_range_edit); |
602 | QHBoxLayout *value_layout = new QHBoxLayout; | 795 | QVBoxLayout *nameposdesc_layout = new QVBoxLayout; |
603 | m_value_table = new QTableWidget(this); | 796 | nameposdesc_layout->addWidget(Misc::EncloseInBox("Information", namepos_layout)); |
604 | m_value_table->setRowCount(ref.GetField().value.size() + 1); | 797 | nameposdesc_layout->addWidget(Misc::EncloseInBox("Description", m_desc_edit)); |
605 | m_value_table->setColumnCount(FieldValueNrColumns); | 798 | nameposdesc_layout->addStretch(0); |
606 | for(size_t row = 0; row < ref.GetField().value.size(); row++) | 799 | |
607 | FillRow(row, ref.GetField().value[row]); | 800 | m_enum_table = new QTableWidget(this); |
608 | CreateNewRow(ref.GetField().value.size()); | 801 | m_enum_table->setColumnCount(4); |
609 | m_value_table->setHorizontalHeaderItem(FieldValueIconColumn, new QTableWidgetItem("")); | 802 | m_enum_table->setHorizontalHeaderItem(0, new QTableWidgetItem("")); |
610 | m_value_table->setHorizontalHeaderItem(FieldValueNameColumn, new QTableWidgetItem("Name")); | 803 | m_enum_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name")); |
611 | m_value_table->setHorizontalHeaderItem(FieldValueValueColumn, new QTableWidgetItem("Value")); | 804 | m_enum_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Value")); |
612 | m_value_table->setHorizontalHeaderItem(FieldValueDescColumn, new QTableWidgetItem("Description")); | 805 | m_enum_table->setHorizontalHeaderItem(3, new QTableWidgetItem("Description")); |
613 | m_value_table->verticalHeader()->setVisible(false); | 806 | m_enum_table->verticalHeader()->setVisible(false); |
614 | m_value_table->horizontalHeader()->setStretchLastSection(true); | 807 | m_enum_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); |
615 | value_layout->addWidget(m_value_table); | 808 | m_enum_delegate = new SocFieldItemDelegate(this); |
616 | m_value_group->setLayout(value_layout); | 809 | m_enum_delegate->setItemEditorFactory(new QItemEditorFactory); |
617 | 810 | m_enum_editor = new SocFieldEditorCreator; | |
618 | QHBoxLayout *line_layout = new QHBoxLayout; | 811 | m_enum_delegate->itemEditorFactory()->registerEditor(QVariant::UInt, m_enum_editor); |
619 | line_layout->addWidget(m_name_group); | 812 | m_enum_table->setItemDelegate(m_enum_delegate); |
620 | line_layout->addWidget(m_bitrange_group); | ||
621 | line_layout->addStretch(); | ||
622 | |||
623 | QVBoxLayout *left_layout = new QVBoxLayout; | ||
624 | left_layout->addLayout(line_layout); | ||
625 | left_layout->addWidget(m_desc_group); | ||
626 | left_layout->addWidget(m_value_group, 1); | ||
627 | |||
628 | UpdateDelegates(); | ||
629 | |||
630 | connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&))); | ||
631 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited())); | ||
632 | connect(m_value_table, SIGNAL(cellActivated(int,int)), this, SLOT(OnValueActivated(int,int))); | ||
633 | connect(m_value_table, SIGNAL(cellChanged(int,int)), this, SLOT(OnValueChanged(int,int))); | ||
634 | connect(m_bitrange_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnBitRangeEdited(const QString&))); | ||
635 | 813 | ||
636 | setLayout(left_layout); | 814 | QHBoxLayout *field_layout = new QHBoxLayout; |
815 | field_layout->addLayout(nameposdesc_layout); | ||
816 | field_layout->addWidget(Misc::EncloseInBox("Special Values", m_enum_table), 1); | ||
817 | |||
818 | setLayout(field_layout); | ||
819 | |||
820 | const soc_desc::field_t& field = *m_ref.get(); | ||
821 | m_name_edit->setText(QString::fromStdString(field.name)); | ||
822 | m_range_edit->setText(m_range_validator->generate( | ||
823 | field.pos + field.width - 1, field.pos)); | ||
824 | m_desc_edit->SetTextHtml(QString::fromStdString(field.desc)); | ||
825 | m_enum_delegate->setWidth(field.width); | ||
826 | m_enum_editor->setWidth(field.width); | ||
827 | m_enum_table->setRowCount(field.enum_.size() + 1); | ||
828 | for(size_t i = 0; i < field.enum_.size(); i++) | ||
829 | { | ||
830 | QTableWidgetItem *item = new QTableWidgetItem( | ||
831 | QIcon::fromTheme("list-remove"), "", RegFieldEditPanelDelType); | ||
832 | item->setFlags(Qt::ItemIsEnabled); | ||
833 | m_enum_table->setItem(i, 0, item); | ||
834 | item = new QTableWidgetItem(QString::fromStdString(field.enum_[i].name)); | ||
835 | m_enum_table->setItem(i, 1, item); | ||
836 | item = new QTableWidgetItem(); | ||
837 | item->setData(Qt::EditRole, QVariant(field.enum_[i].value)); | ||
838 | m_enum_table->setItem(i, 2, item); | ||
839 | item = new QTableWidgetItem(QString::fromStdString(field.enum_[i].desc)); | ||
840 | m_enum_table->setItem(i, 3, item); | ||
841 | } | ||
842 | QTableWidgetItem *new_item = new QTableWidgetItem( | ||
843 | QIcon::fromTheme("list-add"), "", RegFieldEditPanelAddType); | ||
844 | new_item->setFlags(Qt::ItemIsEnabled); | ||
845 | m_enum_table->setItem(field.enum_.size(), 0, new_item); | ||
846 | new_item = new QTableWidgetItem("New field..."); | ||
847 | new_item->setFlags(Qt::ItemIsEnabled); | ||
848 | QFont font = new_item->font(); | ||
849 | font.setItalic(true); | ||
850 | new_item->setFont(font); | ||
851 | m_enum_table->setItem(field.enum_.size(), 1, new_item); | ||
852 | new_item = new QTableWidgetItem(); | ||
853 | new_item->setFlags(Qt::ItemIsEnabled); | ||
854 | m_enum_table->setItem(field.enum_.size(), 2, new_item); | ||
855 | new_item = new QTableWidgetItem(); | ||
856 | new_item->setFlags(Qt::ItemIsEnabled); | ||
857 | m_enum_table->setItem(field.enum_.size(), 3, new_item); | ||
858 | m_enum_table->resizeColumnsToContents(); | ||
859 | m_enum_table->horizontalHeader()->setStretchLastSection(true); | ||
860 | |||
861 | connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, | ||
862 | SLOT(OnFieldNameChanged(const QString&))); | ||
863 | connect(m_range_edit, SIGNAL(textChanged(const QString&)), this, | ||
864 | SLOT(OnFieldRangeChanged(const QString&))); | ||
865 | connect(m_desc_edit, SIGNAL(OnTextChanged(const QString&)), this, | ||
866 | SLOT(OnFieldDescChanged(const QString&))); | ||
867 | connect(m_enum_table, SIGNAL(itemActivated(QTableWidgetItem *)), this, | ||
868 | SLOT(OnFieldValueActivated(QTableWidgetItem *))); | ||
869 | connect(m_enum_table, SIGNAL(itemChanged(QTableWidgetItem *)), this, | ||
870 | SLOT(OnFieldValueChanged(QTableWidgetItem *))); | ||
637 | } | 871 | } |
638 | 872 | ||
639 | void FieldEditPanel::UpdateDelegates() | 873 | void RegFieldEditPanel::UpdateWidth() |
640 | { | 874 | { |
641 | SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(m_ref.GetField(), this); | 875 | m_range_validator->setWidth(m_ref.reg().get()->width); |
642 | QItemEditorFactory *m_table_edit_factory = new QItemEditorFactory(); | ||
643 | SocFieldEditorCreator *m_table_edit_creator = new SocFieldEditorCreator(m_ref.GetField()); | ||
644 | m_table_edit_factory->registerEditor(QVariant::UInt, m_table_edit_creator); | ||
645 | m_table_delegate->setItemEditorFactory(m_table_edit_factory); | ||
646 | m_value_table->setItemDelegate(m_table_delegate); | ||
647 | m_value_table->resizeColumnsToContents(); | ||
648 | } | 876 | } |
649 | 877 | ||
650 | void FieldEditPanel::UpdateWarning(int row) | 878 | void RegFieldEditPanel::OnFieldValueActivated(QTableWidgetItem *item) |
651 | { | 879 | { |
652 | soc_word_t val = m_ref.GetField().value[row].value; | 880 | if(item->type() == RegFieldEditPanelDelType) |
653 | soc_word_t max = m_ref.GetField().bitmask() >> m_ref.GetField().first_bit; | ||
654 | QTableWidgetItem *item = m_value_table->item(row, FieldValueValueColumn); | ||
655 | if(val > max) | ||
656 | { | 881 | { |
657 | item->setIcon(QIcon::fromTheme("dialog-warning")); | 882 | int row = item->row(); |
658 | item->setToolTip("Value is too big for the field"); | 883 | my_remove_at(m_ref.get()->enum_, row); |
884 | m_enum_table->removeRow(row); | ||
885 | OnModified(); | ||
659 | } | 886 | } |
660 | else | 887 | else if(item->type() == RegFieldEditPanelAddType) |
661 | { | 888 | { |
662 | item->setIcon(QIcon()); | 889 | soc_desc::field_t& field = *m_ref.get(); |
663 | item->setToolTip(""); | 890 | int row = field.enum_.size(); |
891 | soc_desc::enum_t new_enum; | ||
892 | new_enum.id = GetFreshId(field.enum_); | ||
893 | new_enum.name = "UNNAMED"; | ||
894 | new_enum.value = 0; | ||
895 | field.enum_.push_back(new_enum); | ||
896 | m_enum_table->insertRow(row); | ||
897 | QTableWidgetItem *item = new QTableWidgetItem( | ||
898 | QIcon::fromTheme("list-remove"), "", RegFieldEditPanelDelType); | ||
899 | item->setFlags(Qt::ItemIsEnabled); | ||
900 | m_enum_table->setItem(row, 0, item); | ||
901 | item = new QTableWidgetItem(QString::fromStdString(new_enum.name)); | ||
902 | m_enum_table->setItem(row, 1, item); | ||
903 | item = new QTableWidgetItem(); | ||
904 | item->setData(Qt::EditRole, QVariant(new_enum.value)); | ||
905 | m_enum_table->setItem(row, 2, item); | ||
906 | item = new QTableWidgetItem(QString::fromStdString(new_enum.desc)); | ||
907 | m_enum_table->setItem(row, 3, item); | ||
908 | OnModified(); | ||
664 | } | 909 | } |
665 | } | 910 | } |
666 | 911 | ||
667 | void FieldEditPanel::FillRow(int row, const soc_reg_field_value_t& val) | 912 | void RegFieldEditPanel::OnFieldValueChanged(QTableWidgetItem *item) |
668 | { | 913 | { |
669 | QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(val.name)); | 914 | soc_desc::field_t& field = *m_ref.get(); |
670 | item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); | 915 | if((size_t)item->row() >= field.enum_.size()) |
671 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | 916 | return; |
672 | m_value_table->setItem(row, FieldValueNameColumn, item); | 917 | soc_desc::enum_t& enum_ = field.enum_[item->row()]; |
673 | item = new QTableWidgetItem(); | 918 | if(item->column() == 1) |
674 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | 919 | enum_.name = item->text().toStdString(); |
675 | item->setData(Qt::DisplayRole, QVariant(val.value)); | 920 | else if(item->column() == 2) |
676 | m_value_table->setItem(row, FieldValueValueColumn, item); | 921 | enum_.value = item->data(Qt::EditRole).value< soc_word_t >(); |
677 | item = new QTableWidgetItem(QString::fromStdString(val.desc)); | 922 | else if(item->column() == 3) |
678 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); | 923 | enum_.desc = item->text().toStdString(); |
679 | m_value_table->setItem(row, FieldValueDescColumn, item); | 924 | OnModified(); |
680 | item = new QTableWidgetItem(QIcon::fromTheme("list-remove"), "", FieldValueDeleteType); | 925 | } |
681 | item->setToolTip("Remove?"); | 926 | |
682 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | 927 | void RegFieldEditPanel::OnFieldNameChanged(const QString& name) |
683 | m_value_table->setItem(row, FieldValueIconColumn, item); | 928 | { |
684 | UpdateWarning(row); | 929 | m_ref.get()->name = name.toStdString(); |
685 | } | 930 | OnModified(); |
686 | |||
687 | void FieldEditPanel::CreateNewRow(int row) | ||
688 | { | ||
689 | QTableWidgetItem *item = new QTableWidgetItem(QIcon::fromTheme("list-add"), "", FieldValueNewType); | ||
690 | item->setToolTip("New?"); | ||
691 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
692 | m_value_table->setItem(row, FieldValueIconColumn, item); | ||
693 | item = new QTableWidgetItem("New value..."); | ||
694 | QFont font = item->font(); | ||
695 | font.setItalic(true); | ||
696 | item->setFont(font); | ||
697 | item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); | ||
698 | m_value_table->setItem(row, FieldValueNameColumn, item); | ||
699 | } | 931 | } |
700 | 932 | ||
701 | void FieldEditPanel::OnBitRangeEdited(const QString& input) | 933 | void RegFieldEditPanel::OnFieldRangeChanged(const QString& range) |
702 | { | 934 | { |
703 | const SocBitRangeValidator *validator = | 935 | soc_desc::field_t *field = m_ref.get(); |
704 | dynamic_cast< const SocBitRangeValidator *>(m_bitrange_edit->validator()); | 936 | int last, first; |
705 | int first, last; | 937 | if(m_range_validator->parse(range, last, first) != QValidator::Acceptable) |
706 | QValidator::State state = validator->parse(input, last, first); | ||
707 | if(state != QValidator::Acceptable) | ||
708 | return; | 938 | return; |
709 | m_ref.GetField().first_bit = first; | 939 | field->pos = first; |
710 | m_ref.GetField().last_bit = last; | 940 | field->width = last - first + 1; |
711 | // update all warning signs | 941 | m_enum_delegate->setWidth(field->width); |
712 | for(size_t row = 0; row < m_ref.GetField().value.size(); row++) | 942 | m_enum_editor->setWidth(field->width); |
713 | UpdateWarning(row); | 943 | OnModified(); |
714 | // also updates delegates because they now have the wrong view of the field | ||
715 | UpdateDelegates(); | ||
716 | OnModified(true); | ||
717 | } | 944 | } |
718 | 945 | ||
719 | void FieldEditPanel::OnNameEdited(const QString& text) | 946 | void RegFieldEditPanel::OnFieldDescChanged(const QString& desc) |
720 | { | 947 | { |
721 | m_ref.GetField().name = text.toStdString(); | 948 | m_ref.get()->desc = desc.toStdString(); |
722 | OnModified(m_name_edit->isModified()); | 949 | OnModified(); |
723 | } | 950 | } |
724 | 951 | ||
725 | void FieldEditPanel::OnDescEdited() | 952 | soc_desc::field_ref_t RegFieldEditPanel::GetField() |
726 | { | 953 | { |
727 | m_ref.GetField().desc = m_desc_edit->GetTextHtml().toStdString(); | 954 | return m_ref; |
728 | OnModified(m_desc_edit->IsModified()); | ||
729 | } | 955 | } |
730 | 956 | ||
731 | void FieldEditPanel::OnValueActivated(int row, int column) | 957 | /** |
958 | * RegEditPanel | ||
959 | */ | ||
960 | |||
961 | namespace | ||
732 | { | 962 | { |
733 | if(column != 0) | 963 | |
734 | return; | 964 | enum |
735 | int type = m_value_table->item(row, column)->type(); | 965 | { |
736 | if(type == FieldValueDeleteType) | 966 | RegVariantEditPanelDelType = QTableWidgetItem::UserType, |
967 | RegVariantEditPanelAddType, | ||
968 | }; | ||
969 | |||
970 | } | ||
971 | |||
972 | RegEditPanel::RegEditPanel(const soc_desc::register_ref_t& ref, QWidget *parent) | ||
973 | :QWidget(parent), m_ref(ref), m_reg_font(font()) | ||
974 | { | ||
975 | m_reg_font.setWeight(100); | ||
976 | m_reg_font.setKerning(false); | ||
977 | |||
978 | m_value_model = new RegFieldTableModel(this); // view takes ownership | ||
979 | m_value_model->SetRegister(*ref.get()); | ||
980 | m_value_model->SetReadOnly(true); | ||
981 | |||
982 | m_sexy_display2 = new Unscroll<YRegDisplay>(this); | ||
983 | m_sexy_display2->setFont(m_reg_font); | ||
984 | m_sexy_display2->setModel(m_value_model); | ||
985 | m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
986 | m_sexy_display2->setContextMenuPolicy(Qt::CustomContextMenu); | ||
987 | m_sexy_display2->setWidth(m_ref.get()->width); | ||
988 | |||
989 | m_view_tab = new QTabWidget(this); | ||
990 | m_view_tab->setTabPosition(QTabWidget::West); | ||
991 | |||
992 | /* field tab */ | ||
993 | m_fields_tab = new YTabWidget(0, this); | ||
994 | m_fields_tab->setTabOpenable(true); | ||
995 | std::vector< soc_desc::field_ref_t > field_list = m_ref.fields(); | ||
996 | m_fields_tab->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); | ||
997 | m_fields_tab->setTabsClosable(true); | ||
998 | m_fields_tab->setElideMode(Qt::ElideRight); | ||
999 | for(size_t i = 0; i < field_list.size(); i++) | ||
737 | { | 1000 | { |
738 | m_ref.GetField().value.erase(m_ref.GetField().value.begin() + row); | 1001 | RegFieldEditPanel *p = new RegFieldEditPanel(field_list[i], this); |
739 | m_value_table->removeRow(row); | 1002 | connect(p, SIGNAL(OnModified()), this, SLOT(OnFieldModified())); |
740 | OnModified(true); | 1003 | m_fields_tab->addTab(p, QString::fromStdString(field_list[i].get()->name)); |
741 | } | 1004 | } |
742 | else if(type == FieldValueNewType) | 1005 | |
1006 | m_reg_size_group = new QButtonGroup(this); | ||
1007 | QRadioButton *reg_size_32 = new QRadioButton("32-bit"); | ||
1008 | QRadioButton *reg_size_16 = new QRadioButton("16-bit"); | ||
1009 | QRadioButton *reg_size_8 = new QRadioButton("8-bit"); | ||
1010 | m_reg_size_group->addButton(reg_size_32, 32); | ||
1011 | m_reg_size_group->addButton(reg_size_16, 16); | ||
1012 | m_reg_size_group->addButton(reg_size_8, 8); | ||
1013 | if(m_reg_size_group->button(m_ref.get()->width)) | ||
1014 | m_reg_size_group->button(m_ref.get()->width)->click(); | ||
1015 | QVBoxLayout *width_group_layout = new QVBoxLayout; | ||
1016 | width_group_layout->addWidget(reg_size_32); | ||
1017 | width_group_layout->addWidget(reg_size_16); | ||
1018 | width_group_layout->addWidget(reg_size_8); | ||
1019 | width_group_layout->addStretch(0); | ||
1020 | QGroupBox *width_group = new QGroupBox("Width"); | ||
1021 | width_group->setLayout(width_group_layout); | ||
1022 | |||
1023 | m_variant_table = new QTableWidget; | ||
1024 | m_variant_table->setColumnCount(3); | ||
1025 | m_variant_table->setHorizontalHeaderItem(0, new QTableWidgetItem("")); | ||
1026 | m_variant_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Type")); | ||
1027 | m_variant_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Offset")); | ||
1028 | m_variant_table->verticalHeader()->setVisible(false); | ||
1029 | m_variant_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||
1030 | m_variant_delegate = new SocFieldItemDelegate(this); | ||
1031 | m_variant_delegate->setItemEditorFactory(new QItemEditorFactory); | ||
1032 | m_variant_editor = new SocFieldEditorCreator; | ||
1033 | m_variant_delegate->itemEditorFactory()->registerEditor(QVariant::UInt, m_variant_editor); | ||
1034 | m_variant_table->setItemDelegate(m_variant_delegate); | ||
1035 | |||
1036 | std::vector< soc_desc::variant_ref_t > variants = m_ref.variants(); | ||
1037 | m_variant_table->setRowCount(variants.size() + 1); | ||
1038 | for(size_t i = 0; i < variants.size(); i++) | ||
743 | { | 1039 | { |
744 | m_value_table->insertRow(row); | 1040 | QTableWidgetItem *item = new QTableWidgetItem( |
745 | soc_reg_field_value_t val; | 1041 | QIcon::fromTheme("list-remove"), "", RegVariantEditPanelDelType); |
746 | val.name = QString("UNNAMED_%1").arg(row).toStdString(); | 1042 | item->setFlags(Qt::ItemIsEnabled); |
747 | val.value = 0; | 1043 | m_variant_table->setItem(i, 0, item); |
748 | m_ref.GetField().value.push_back(val); | 1044 | item = new QTableWidgetItem(QString::fromStdString(variants[i].get()->type)); |
749 | FillRow(row, val); | 1045 | m_variant_table->setItem(i, 1, item); |
1046 | item = new QTableWidgetItem(); | ||
1047 | item->setData(Qt::EditRole, QVariant(variants[i].get()->offset)); | ||
1048 | m_variant_table->setItem(i, 2, item); | ||
750 | } | 1049 | } |
1050 | QTableWidgetItem *new_item = new QTableWidgetItem( | ||
1051 | QIcon::fromTheme("list-add"), "", RegVariantEditPanelAddType); | ||
1052 | new_item->setFlags(Qt::ItemIsEnabled); | ||
1053 | m_variant_table->setItem(variants.size(), 0, new_item); | ||
1054 | new_item = new QTableWidgetItem("New variant..."); | ||
1055 | new_item->setFlags(Qt::ItemIsEnabled); | ||
1056 | QFont font = new_item->font(); | ||
1057 | font.setItalic(true); | ||
1058 | new_item->setFont(font); | ||
1059 | m_variant_table->setItem(variants.size(), 1, new_item); | ||
1060 | new_item = new QTableWidgetItem(); | ||
1061 | new_item->setFlags(Qt::ItemIsEnabled); | ||
1062 | m_variant_table->setItem(variants.size(), 2, new_item); | ||
1063 | new_item = new QTableWidgetItem(); | ||
1064 | new_item->setFlags(Qt::ItemIsEnabled); | ||
1065 | m_variant_table->resizeColumnsToContents(); | ||
1066 | m_variant_table->horizontalHeader()->setStretchLastSection(true); | ||
1067 | |||
1068 | m_desc_edit = new MyTextEditor(this); | ||
1069 | m_desc_edit->SetTextHtml(QString::fromStdString(ref.get()->desc)); | ||
1070 | |||
1071 | QHBoxLayout *top_info_layout = new QHBoxLayout; | ||
1072 | top_info_layout->addWidget(width_group); | ||
1073 | top_info_layout->addWidget(Misc::EncloseInBox("Variants", m_variant_table)); | ||
1074 | top_info_layout->addWidget(Misc::EncloseInBox("Description", m_desc_edit)); | ||
1075 | |||
1076 | QWidget *reg_info = new QWidget(this); | ||
1077 | QVBoxLayout *reg_info_layout = new QVBoxLayout; | ||
1078 | reg_info_layout->addLayout(top_info_layout); | ||
1079 | reg_info_layout->addStretch(0); | ||
1080 | reg_info->setLayout(reg_info_layout); | ||
1081 | |||
1082 | m_view_tab->addTab(reg_info, "Information"); | ||
1083 | m_view_tab->addTab(m_fields_tab, "Fields"); | ||
1084 | |||
1085 | QVBoxLayout *main_layout = new QVBoxLayout; | ||
1086 | main_layout->addWidget(m_sexy_display2, 1); | ||
1087 | main_layout->addWidget(m_view_tab, 2); | ||
1088 | |||
1089 | m_delete_action = new QAction("&Delete", this); | ||
1090 | m_delete_action->setIcon(QIcon::fromTheme("list-remove")); | ||
1091 | m_new_action = new QAction("&New field", this); | ||
1092 | m_new_action->setIcon(QIcon::fromTheme("list-add")); | ||
1093 | |||
1094 | setLayout(main_layout); | ||
1095 | |||
1096 | OnRegFieldActivated(QModelIndex()); | ||
1097 | UpdateWidthRestrictions(); | ||
1098 | |||
1099 | connect(m_sexy_display2, SIGNAL(clicked(const QModelIndex&)), this, | ||
1100 | SLOT(OnRegFieldActivated(const QModelIndex&))); | ||
1101 | connect(m_sexy_display2, SIGNAL(customContextMenuRequested(QPoint)), this, | ||
1102 | SLOT(OnRegDisplayContextMenu(QPoint))); | ||
1103 | connect(m_reg_size_group, SIGNAL(buttonClicked(int)), this, SLOT(OnWidthChanged(int))); | ||
1104 | connect(m_delete_action, SIGNAL(triggered()), this, SLOT(OnRegFieldDelete())); | ||
1105 | connect(m_new_action, SIGNAL(triggered()), this, SLOT(OnRegFieldNew())); | ||
1106 | connect(m_variant_table, SIGNAL(itemActivated(QTableWidgetItem *)), this, | ||
1107 | SLOT(OnVariantActivated(QTableWidgetItem *))); | ||
1108 | connect(m_variant_table, SIGNAL(itemChanged(QTableWidgetItem *)), this, | ||
1109 | SLOT(OnVariantValueChanged(QTableWidgetItem *))); | ||
1110 | connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited())); | ||
1111 | connect(m_fields_tab, SIGNAL(tabCloseRequested(int)), this, SLOT(OnFieldRemove(int))); | ||
1112 | connect(m_fields_tab, SIGNAL(tabOpenRequested()), this, SLOT(OnFieldCreate())); | ||
751 | } | 1113 | } |
752 | 1114 | ||
753 | void FieldEditPanel::OnValueChanged(int row, int column) | 1115 | void RegEditPanel::UpdateWidthRestrictions() |
754 | { | 1116 | { |
755 | /* ignore extra row for addition */ | 1117 | /* only allow width large enough to fit all fields */ |
756 | if(row >= (int)m_ref.GetField().value.size()) | 1118 | size_t max_bit = 0; |
757 | return; | 1119 | std::vector< soc_desc::field_ref_t > field_list = m_ref.fields(); |
758 | QTableWidgetItem *item = m_value_table->item(row, column); | 1120 | for(size_t i = 0; i < field_list.size(); i++) |
759 | if(column == FieldValueNameColumn) | ||
760 | m_ref.GetField().value[row].name = item->text().toStdString(); | ||
761 | else if(column == FieldValueValueColumn) | ||
762 | { | 1121 | { |
763 | soc_word_t& fval = m_ref.GetField().value[row].value; | 1122 | soc_desc::field_t& f = *field_list[i].get(); |
764 | soc_word_t new_val = item->data(Qt::DisplayRole).toUInt(); | 1123 | max_bit = std::max(max_bit, f.pos + f.width - 1); |
765 | /* avoid infinite recursion by calling UpdateWarning() when | ||
766 | * only the icon changes which would trigger this callback again */ | ||
767 | if(fval != new_val) | ||
768 | { | ||
769 | fval = new_val; | ||
770 | UpdateWarning(row); | ||
771 | } | ||
772 | } | 1124 | } |
773 | else if(column == FieldValueDescColumn) | 1125 | /* update buttons */ |
774 | m_ref.GetField().value[row].desc = item->text().toStdString(); | 1126 | m_reg_size_group->button(8)->setEnabled(max_bit < 8); |
775 | OnModified(true); | 1127 | m_reg_size_group->button(16)->setEnabled(max_bit < 16); |
1128 | m_reg_size_group->button(32)->setEnabled(max_bit < 32); | ||
776 | } | 1129 | } |
777 | 1130 | ||
778 | namespace | 1131 | int RegEditPanel::IndexById(soc_id_t id) |
779 | { | 1132 | { |
1133 | for(int i = 0; i < m_fields_tab->count(); i++) | ||
1134 | { | ||
1135 | RegFieldEditPanel *p = dynamic_cast< RegFieldEditPanel * >(m_fields_tab->widget(i)); | ||
1136 | if(p->GetField().get()->id == id) | ||
1137 | return i; | ||
1138 | } | ||
1139 | return -1; | ||
1140 | } | ||
780 | 1141 | ||
781 | enum | 1142 | void RegEditPanel::OnWidthChanged(int w) |
782 | { | 1143 | { |
783 | SocTreeSocType = QTreeWidgetItem::UserType, | 1144 | m_ref.get()->width = w; |
784 | SocTreeDevType, | 1145 | m_sexy_display2->setWidth(w); |
785 | SocTreeRegType, | 1146 | for(int i = 0; i < m_fields_tab->count(); i++) |
786 | SocTreeFieldType, | 1147 | dynamic_cast< RegFieldEditPanel * >(m_fields_tab->widget(i))->UpdateWidth(); |
787 | SocTreeNewDevType, | 1148 | OnModified(); |
788 | SocTreeNewRegType, | 1149 | } |
789 | SocTreeNewFieldType, | ||
790 | }; | ||
791 | |||
792 | /** | ||
793 | * SocTreeItem | ||
794 | */ | ||
795 | 1150 | ||
796 | class SocTreeItem : public QTreeWidgetItem | 1151 | void RegEditPanel::OnDescEdited() |
797 | { | 1152 | { |
798 | public: | 1153 | m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString(); |
799 | SocTreeItem(const QString& string, const SocRef& ref) | 1154 | OnModified(); |
800 | :QTreeWidgetItem(QStringList(string), SocTreeSocType), m_ref(ref) {} | 1155 | } |
801 | 1156 | ||
802 | const SocRef& GetRef() { return m_ref; } | 1157 | void RegEditPanel::OnVariantActivated(QTableWidgetItem *item) |
803 | private: | 1158 | { |
804 | SocRef m_ref; | 1159 | if(item->type() == RegVariantEditPanelDelType) |
805 | }; | 1160 | { |
1161 | int row = item->row(); | ||
1162 | my_remove_at(m_ref.get()->variant, row); | ||
1163 | m_variant_table->removeRow(row); | ||
1164 | OnModified(); | ||
1165 | } | ||
1166 | else if(item->type() == RegVariantEditPanelAddType) | ||
1167 | { | ||
1168 | int row = m_ref.get()->variant.size(); | ||
1169 | soc_desc::variant_t& variant = *m_ref.create_variant().get(); | ||
1170 | variant.type = "untyped"; | ||
1171 | variant.offset = 0; | ||
1172 | m_variant_table->insertRow(row); | ||
1173 | QTableWidgetItem *item = new QTableWidgetItem( | ||
1174 | QIcon::fromTheme("list-remove"), "", RegVariantEditPanelDelType); | ||
1175 | item->setFlags(Qt::ItemIsEnabled); | ||
1176 | m_variant_table->setItem(row, 0, item); | ||
1177 | item = new QTableWidgetItem(QString::fromStdString(variant.type)); | ||
1178 | m_variant_table->setItem(row, 1, item); | ||
1179 | item = new QTableWidgetItem(); | ||
1180 | item->setData(Qt::EditRole, QVariant(variant.offset)); | ||
1181 | m_variant_table->setItem(row, 2, item); | ||
1182 | OnModified(); | ||
1183 | } | ||
1184 | } | ||
806 | 1185 | ||
807 | /** | 1186 | void RegEditPanel::OnVariantValueChanged(QTableWidgetItem *item) |
808 | * NewDevTreeItem | 1187 | { |
809 | */ | 1188 | soc_desc::register_t& reg = *m_ref.get(); |
1189 | if((size_t)item->row() >= reg.variant.size()) | ||
1190 | return; | ||
1191 | soc_desc::variant_t& var = reg.variant[item->row()]; | ||
1192 | if(item->column() == 1) | ||
1193 | var.type = item->text().toStdString(); | ||
1194 | else if(item->column() == 2) | ||
1195 | var.offset = item->data(Qt::EditRole).value< soc_word_t >(); | ||
1196 | OnModified(); | ||
1197 | } | ||
810 | 1198 | ||
811 | class NewDevTreeItem : public QTreeWidgetItem | 1199 | void RegEditPanel::OnRegFieldActivated(const QModelIndex& index) |
812 | { | 1200 | { |
813 | public: | 1201 | if(!index.isValid()) |
814 | NewDevTreeItem(const QString& string, const SocRef& ref) | 1202 | return; |
815 | :QTreeWidgetItem(QStringList(string), SocTreeNewDevType), m_ref(ref) {} | 1203 | m_fields_tab->setCurrentIndex(IndexById(m_ref.get()->field[index.row()].id)); |
1204 | m_view_tab->setCurrentIndex(1); | ||
1205 | } | ||
816 | 1206 | ||
817 | const SocRef& GetRef() { return m_ref; } | 1207 | void RegEditPanel::OnFieldModified() |
818 | private: | 1208 | { |
819 | SocRef m_ref; | 1209 | int idx = m_fields_tab->currentIndex(); |
820 | }; | 1210 | RegFieldEditPanel *p = dynamic_cast< RegFieldEditPanel * >(m_fields_tab->widget(idx)); |
1211 | m_fields_tab->setTabText(idx, QString::fromStdString(p->GetField().get()->name)); | ||
1212 | DoModify(); | ||
1213 | } | ||
821 | 1214 | ||
822 | /** | 1215 | void RegEditPanel::DoModify() |
823 | * DevTreeItem | 1216 | { |
824 | */ | 1217 | m_value_model->UpdateRegister(*m_ref.get()); |
1218 | UpdateWidthRestrictions(); | ||
1219 | OnModified(); | ||
1220 | } | ||
825 | 1221 | ||
826 | class DevTreeItem : public QTreeWidgetItem | 1222 | void RegEditPanel::OnRegFieldDelete() |
827 | { | 1223 | { |
828 | public: | 1224 | QModelIndex current = m_sexy_display2->currentIndex(); |
829 | DevTreeItem(const QString& string, const SocDevRef& ref) | 1225 | if(!current.isValid()) |
830 | :QTreeWidgetItem(QStringList(string), SocTreeDevType), m_ref(ref) {} | 1226 | return; |
1227 | QMessageBox msgbox(QMessageBox::Question, "Delete field ?", | ||
1228 | "Are you sure you want to delete this field ?", | ||
1229 | QMessageBox::Yes | QMessageBox::No, this); | ||
1230 | msgbox.setDefaultButton(QMessageBox::No); | ||
1231 | int ret = msgbox.exec(); | ||
1232 | if(ret != QMessageBox::Yes) | ||
1233 | return; | ||
1234 | m_fields_tab->removeTab(IndexById(m_ref.get()->field[current.row()].id)); | ||
1235 | my_remove_at(m_ref.get()->field, current.row()); | ||
1236 | DoModify(); | ||
1237 | OnRegFieldActivated(QModelIndex()); | ||
1238 | } | ||
831 | 1239 | ||
832 | const SocDevRef& GetRef() { return m_ref; } | 1240 | void RegEditPanel::OnFieldRemove(int index) |
833 | private: | 1241 | { |
834 | SocDevRef m_ref; | 1242 | Q_UNUSED(index); |
835 | }; | 1243 | } |
836 | 1244 | ||
837 | /** | 1245 | int RegEditPanel::FindFreeBit(int preferred) |
838 | * NewRegTreeItem | 1246 | { |
839 | */ | 1247 | int nr_bits = m_ref.get()->width; |
1248 | soc_word_t free_mask = (nr_bits == 32) ? 0xffffffff : (1 << nr_bits) - 1; | ||
1249 | soc_desc::register_t& reg = *m_ref.get(); | ||
1250 | for(size_t i = 0; i < reg.field.size(); i++) | ||
1251 | free_mask &= ~reg.field[i].bitmask(); | ||
1252 | /* any space ? */ | ||
1253 | if(free_mask == 0) | ||
1254 | return -1; | ||
1255 | int closest_bit = -1; | ||
1256 | int closest_dist = nr_bits; | ||
1257 | for(int bit = 0; bit < nr_bits; bit++) | ||
1258 | { | ||
1259 | if(!(free_mask & (1 << bit))) | ||
1260 | continue; | ||
1261 | if(abs(bit - preferred) < closest_dist) | ||
1262 | { | ||
1263 | closest_bit = bit; | ||
1264 | closest_dist = abs(bit - preferred); | ||
1265 | } | ||
1266 | } | ||
1267 | return closest_bit; | ||
1268 | } | ||
840 | 1269 | ||
841 | class NewRegTreeItem : public QTreeWidgetItem | 1270 | void RegEditPanel::OnRegFieldNew() |
842 | { | 1271 | { |
843 | public: | 1272 | int bit_col = m_sexy_display2->bitColumnAt(m_menu_point); |
844 | NewRegTreeItem(const QString& string, const SocDevRef& ref) | 1273 | /* we need to make sure the created field does not overlap something */ |
845 | :QTreeWidgetItem(QStringList(string), SocTreeNewRegType), m_ref(ref) {} | 1274 | bit_col = FindFreeBit(bit_col); |
1275 | if(bit_col == -1) | ||
1276 | return; /* impossible to find a free position */ | ||
1277 | soc_desc::field_ref_t ref = m_ref.create_field(); | ||
1278 | soc_desc::field_t& field = *ref.get(); | ||
1279 | field.pos = bit_col; | ||
1280 | field.width = 1; | ||
1281 | field.name = "UNNAMED"; | ||
846 | 1282 | ||
847 | const SocDevRef& GetRef() { return m_ref; } | 1283 | RegFieldEditPanel *p = new RegFieldEditPanel(ref, this); |
848 | private: | 1284 | connect(p, SIGNAL(OnModified()), this, SLOT(OnFieldModified())); |
849 | SocDevRef m_ref; | 1285 | m_fields_tab->addTab(p, QString::fromStdString(field.name)); |
850 | }; | ||
851 | 1286 | ||
852 | /** | 1287 | DoModify(); |
853 | * RegTreeItem | 1288 | } |
854 | */ | ||
855 | 1289 | ||
856 | class RegTreeItem : public QTreeWidgetItem | 1290 | void RegEditPanel::OnFieldCreate() |
857 | { | 1291 | { |
858 | public: | 1292 | OnRegFieldNew(); |
859 | RegTreeItem(const QString& string, const SocRegRef& ref) | 1293 | } |
860 | :QTreeWidgetItem(QStringList(string), SocTreeRegType), m_ref(ref) {} | ||
861 | |||
862 | const SocRegRef& GetRef() { return m_ref; } | ||
863 | private: | ||
864 | SocRegRef m_ref; | ||
865 | }; | ||
866 | 1294 | ||
867 | /** | 1295 | void RegEditPanel::OnRegDisplayContextMenu(QPoint point) |
868 | * NewFieldTreeItem | 1296 | { |
869 | */ | 1297 | m_menu_point = point; |
1298 | QMenu *menu = new QMenu(this); | ||
1299 | QModelIndex item = m_sexy_display2->indexAt(point); | ||
1300 | menu->addAction(m_new_action); | ||
1301 | if(item.isValid()) | ||
1302 | menu->addAction(m_delete_action); | ||
1303 | menu->popup(m_sexy_display2->viewport()->mapToGlobal(point)); | ||
1304 | } | ||
870 | 1305 | ||
871 | class NewFieldTreeItem : public QTreeWidgetItem | 1306 | namespace |
872 | { | 1307 | { |
873 | public: | ||
874 | NewFieldTreeItem(const QString& string, const SocRegRef& ref) | ||
875 | :QTreeWidgetItem(QStringList(string), SocTreeNewFieldType), m_ref(ref) {} | ||
876 | 1308 | ||
877 | const SocRegRef& GetRef() { return m_ref; } | 1309 | enum |
878 | private: | 1310 | { |
879 | SocRegRef m_ref; | 1311 | SocTreeSocType = QTreeWidgetItem::UserType, // SocRefRole -> node_ref_t to root |
1312 | SocTreeNodeType, // SocRefRole -> node_ref_t | ||
1313 | SocTreeRegType, // SocRefRole -> register_ref_t | ||
880 | }; | 1314 | }; |
881 | 1315 | ||
882 | /** | 1316 | enum |
883 | * FieldTreeItem | 1317 | { |
884 | */ | 1318 | SocRefRole = Qt::UserRole, |
1319 | }; | ||
885 | 1320 | ||
886 | class FieldTreeItem : public QTreeWidgetItem | 1321 | template<typename T> |
1322 | T SocTreeItemVal(QTreeWidgetItem *item) | ||
887 | { | 1323 | { |
888 | public: | 1324 | return item->data(0, SocRefRole).value<T>(); |
889 | FieldTreeItem(const QString& string, const SocFieldRef& ref) | 1325 | } |
890 | :QTreeWidgetItem(QStringList(string), SocTreeFieldType), m_ref(ref) {} | ||
891 | 1326 | ||
892 | const SocFieldRef& GetRef() { return m_ref; } | 1327 | template<typename T> |
893 | private: | 1328 | QTreeWidgetItem *MakeSocTreeItem(int type, const T& val) |
894 | SocFieldRef m_ref; | 1329 | { |
895 | }; | 1330 | QTreeWidgetItem *item = new QTreeWidgetItem(type); |
1331 | item->setData(0, SocRefRole, QVariant::fromValue(val)); | ||
1332 | return item; | ||
1333 | } | ||
896 | 1334 | ||
897 | } | 1335 | } |
898 | 1336 | ||
@@ -903,8 +1341,7 @@ RegEdit::RegEdit(Backend *backend, QWidget *parent) | |||
903 | :QWidget(parent), m_backend(backend) | 1341 | :QWidget(parent), m_backend(backend) |
904 | { | 1342 | { |
905 | QVBoxLayout *m_vert_layout = new QVBoxLayout(); | 1343 | QVBoxLayout *m_vert_layout = new QVBoxLayout(); |
906 | m_file_group = new QGroupBox("File selection", this); | 1344 | QLabel *file_static = new QLabel("File:"); |
907 | QHBoxLayout *m_file_group_layout = new QHBoxLayout(); | ||
908 | m_file_edit = new QLineEdit(this); | 1345 | m_file_edit = new QLineEdit(this); |
909 | m_file_edit->setReadOnly(true); | 1346 | m_file_edit->setReadOnly(true); |
910 | m_file_open = new QToolButton(this); | 1347 | m_file_open = new QToolButton(this); |
@@ -913,33 +1350,53 @@ RegEdit::RegEdit(Backend *backend, QWidget *parent) | |||
913 | m_file_open->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); | 1350 | m_file_open->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); |
914 | QMenu *file_open_menu = new QMenu(this); | 1351 | QMenu *file_open_menu = new QMenu(this); |
915 | QAction *new_act = file_open_menu->addAction(QIcon::fromTheme("document-new"), "New..."); | 1352 | QAction *new_act = file_open_menu->addAction(QIcon::fromTheme("document-new"), "New..."); |
1353 | m_file_open->setPopupMode(QToolButton::MenuButtonPopup); | ||
916 | m_file_open->setMenu(file_open_menu); | 1354 | m_file_open->setMenu(file_open_menu); |
917 | 1355 | ||
918 | m_file_save = new QToolButton(this); | 1356 | m_file_save = new QToolButton(this); |
919 | m_file_save->setText("Save"); | 1357 | m_file_save->setText("Save"); |
920 | m_file_save->setIcon(QIcon::fromTheme("document-save")); | 1358 | m_file_save->setIcon(QIcon::fromTheme("document-save")); |
921 | m_file_save->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); | 1359 | m_file_save->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); |
1360 | m_file_save->setPopupMode(QToolButton::MenuButtonPopup); | ||
922 | QMenu *file_save_menu = new QMenu(this); | 1361 | QMenu *file_save_menu = new QMenu(this); |
923 | QAction *saveas_act = file_save_menu->addAction(QIcon::fromTheme("document-save-as"), "Save as..."); | 1362 | QAction *saveas_act = file_save_menu->addAction(QIcon::fromTheme("document-save-as"), "Save as..."); |
924 | m_file_save->setMenu(file_save_menu); | 1363 | m_file_save->setMenu(file_save_menu); |
925 | m_file_group_layout->addWidget(m_file_open); | 1364 | |
926 | m_file_group_layout->addWidget(m_file_save); | 1365 | QHBoxLayout *file_group_layout = new QHBoxLayout(); |
927 | m_file_group_layout->addWidget(m_file_edit); | 1366 | file_group_layout->addWidget(m_file_open); |
1367 | file_group_layout->addWidget(m_file_save); | ||
1368 | file_group_layout->addWidget(file_static); | ||
1369 | file_group_layout->addWidget(m_file_edit); | ||
928 | 1370 | ||
929 | m_splitter = new QSplitter(this); | 1371 | m_splitter = new QSplitter(this); |
930 | m_soc_tree = new QTreeWidget(this); | 1372 | m_soc_tree = new QTreeWidget(this); |
931 | m_soc_tree->setColumnCount(1); | 1373 | m_soc_tree->setColumnCount(1); |
932 | m_soc_tree->setHeaderLabel(QString("Name")); | 1374 | m_soc_tree->setHeaderLabel(QString("Name")); |
933 | m_soc_tree->setContextMenuPolicy(Qt::ActionsContextMenu); | 1375 | m_soc_tree->setContextMenuPolicy(Qt::CustomContextMenu); |
934 | QAction *soc_tree_delete_action = new QAction("&Delete", this); | 1376 | |
935 | soc_tree_delete_action->setIcon(QIcon::fromTheme("list-remove")); | 1377 | m_delete_action = new QAction("&Delete", this); |
936 | connect(soc_tree_delete_action, SIGNAL(triggered()), this, SLOT(OnSocItemDelete())); | 1378 | m_delete_action->setIcon(QIcon::fromTheme("list-remove")); |
937 | m_soc_tree->addAction(soc_tree_delete_action); | 1379 | m_new_action = new QAction("&New", this); |
1380 | m_new_action->setIcon(QIcon::fromTheme("list-add")); | ||
1381 | m_create_action = new QAction("&Create register", this); | ||
1382 | m_create_action->setIcon(QIcon::fromTheme("folder-new")); | ||
1383 | |||
938 | m_splitter->addWidget(m_soc_tree); | 1384 | m_splitter->addWidget(m_soc_tree); |
939 | m_splitter->setStretchFactor(0, 0); | 1385 | m_splitter->setStretchFactor(0, 0); |
940 | 1386 | ||
941 | m_file_group->setLayout(m_file_group_layout); | 1387 | m_msg = new MessageWidget(this); |
942 | m_vert_layout->addWidget(m_file_group); | 1388 | QWidget *splitter_right = new QWidget(this); |
1389 | m_right_panel_layout = new QVBoxLayout; | ||
1390 | m_right_panel_layout->addWidget(m_msg, 0); | ||
1391 | splitter_right->setLayout(m_right_panel_layout); | ||
1392 | m_splitter->addWidget(splitter_right); | ||
1393 | m_splitter->setStretchFactor(1, 2); | ||
1394 | |||
1395 | m_msg_welcome_id = SetMessage(MessageWidget::Information, | ||
1396 | "Open a description file to edit, or create a new file from scratch."); | ||
1397 | m_msg_name_error_id = 0; | ||
1398 | |||
1399 | m_vert_layout->addLayout(file_group_layout); | ||
943 | m_vert_layout->addWidget(m_splitter, 1); | 1400 | m_vert_layout->addWidget(m_splitter, 1); |
944 | 1401 | ||
945 | setLayout(m_vert_layout); | 1402 | setLayout(m_vert_layout); |
@@ -949,14 +1406,17 @@ RegEdit::RegEdit(Backend *backend, QWidget *parent) | |||
949 | SetPanel(new EmptyEditPanel(this)); | 1406 | SetPanel(new EmptyEditPanel(this)); |
950 | UpdateTabName(); | 1407 | UpdateTabName(); |
951 | 1408 | ||
1409 | connect(m_soc_tree, SIGNAL(customContextMenuRequested(QPoint)), this, | ||
1410 | SLOT(OnSocTreeContextMenu(QPoint))); | ||
1411 | connect(m_delete_action, SIGNAL(triggered()), this, SLOT(OnSocItemDelete())); | ||
1412 | connect(m_new_action, SIGNAL(triggered()), this, SLOT(OnSocItemNew())); | ||
1413 | connect(m_create_action, SIGNAL(triggered()), this, SLOT(OnSocItemCreate())); | ||
952 | connect(m_file_open, SIGNAL(clicked()), this, SLOT(OnOpen())); | 1414 | connect(m_file_open, SIGNAL(clicked()), this, SLOT(OnOpen())); |
953 | connect(m_file_save, SIGNAL(clicked()), this, SLOT(OnSave())); | 1415 | connect(m_file_save, SIGNAL(clicked()), this, SLOT(OnSave())); |
954 | connect(new_act, SIGNAL(triggered()), this, SLOT(OnNew())); | 1416 | connect(new_act, SIGNAL(triggered()), this, SLOT(OnNew())); |
955 | connect(saveas_act, SIGNAL(triggered()), this, SLOT(OnSaveAs())); | 1417 | connect(saveas_act, SIGNAL(triggered()), this, SLOT(OnSaveAs())); |
956 | connect(m_soc_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), | 1418 | connect(m_soc_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), |
957 | this, SLOT(OnSocItemChanged(QTreeWidgetItem*, QTreeWidgetItem*))); | 1419 | this, SLOT(OnSocItemChanged(QTreeWidgetItem*, QTreeWidgetItem*))); |
958 | connect(m_soc_tree, SIGNAL(itemActivated(QTreeWidgetItem*, int)), | ||
959 | this, SLOT(OnSocItemActivated(QTreeWidgetItem*, int))); | ||
960 | } | 1420 | } |
961 | 1421 | ||
962 | QWidget *RegEdit::GetWidget() | 1422 | QWidget *RegEdit::GetWidget() |
@@ -968,6 +1428,16 @@ RegEdit::~RegEdit() | |||
968 | { | 1428 | { |
969 | } | 1429 | } |
970 | 1430 | ||
1431 | int RegEdit::SetMessage(MessageWidget::MessageType type, const QString& msg) | ||
1432 | { | ||
1433 | return m_msg->SetMessage(type, msg); | ||
1434 | } | ||
1435 | |||
1436 | void RegEdit::HideMessage(int id) | ||
1437 | { | ||
1438 | m_msg->HideMessage(id); | ||
1439 | } | ||
1440 | |||
971 | void RegEdit::OnSave() | 1441 | void RegEdit::OnSave() |
972 | { | 1442 | { |
973 | SaveSoc(); | 1443 | SaveSoc(); |
@@ -1007,7 +1477,10 @@ bool RegEdit::GetFilename(QString& filename, bool save) | |||
1007 | QFileDialog *fd = new QFileDialog(this); | 1477 | QFileDialog *fd = new QFileDialog(this); |
1008 | if(save) | 1478 | if(save) |
1009 | fd->setAcceptMode(QFileDialog::AcceptSave); | 1479 | fd->setAcceptMode(QFileDialog::AcceptSave); |
1010 | fd->setFilter("Description files (*.xml);;All files (*)"); | 1480 | QStringList filters; |
1481 | filters << "Description files (*.xml)"; | ||
1482 | filters << "All files (*)"; | ||
1483 | fd->setNameFilters(filters); | ||
1011 | fd->setDirectory(Settings::Get()->value("regedit/loaddescdir", QDir::currentPath()).toString()); | 1484 | fd->setDirectory(Settings::Get()->value("regedit/loaddescdir", QDir::currentPath()).toString()); |
1012 | if(fd->exec()) | 1485 | if(fd->exec()) |
1013 | { | 1486 | { |
@@ -1051,15 +1524,15 @@ void RegEdit::OnNew() | |||
1051 | 1524 | ||
1052 | bool RegEdit::SaveSocFile(const QString& filename) | 1525 | bool RegEdit::SaveSocFile(const QString& filename) |
1053 | { | 1526 | { |
1054 | normalize(m_cur_socfile.GetSoc()); | 1527 | soc_desc::error_context_t ctx; |
1055 | if(!produce_xml(filename.toStdString(), m_cur_socfile.GetSoc())) | 1528 | soc_desc::normalize(m_cur_socfile.GetSoc()); |
1529 | if(!soc_desc::produce_xml(filename.toStdString(), m_cur_socfile.GetSoc(), ctx)) | ||
1056 | { | 1530 | { |
1057 | QMessageBox::warning(this, "The description was not saved", | 1531 | QMessageBox::warning(this, "The description was not saved", |
1058 | "There was an error when saving the file"); | 1532 | "There was an error when saving the file"); |
1059 | return false; | 1533 | return false; |
1060 | } | 1534 | } |
1061 | m_soc_tree->clear(); | 1535 | UpdateSocFile(); |
1062 | FillSocTree(); | ||
1063 | SetModified(false, false); | 1536 | SetModified(false, false); |
1064 | return true; | 1537 | return true; |
1065 | } | 1538 | } |
@@ -1086,91 +1559,39 @@ void RegEdit::LoadSocFile(const QString& filename) | |||
1086 | SetModified(false, false); | 1559 | SetModified(false, false); |
1087 | UpdateSocFile(); | 1560 | UpdateSocFile(); |
1088 | UpdateTabName(); | 1561 | UpdateTabName(); |
1562 | m_msg_welcome_id = SetMessage(MessageWidget::Information, | ||
1563 | "Select items to edit in tree, or right-click on them to see available actions."); | ||
1089 | } | 1564 | } |
1090 | 1565 | ||
1091 | void RegEdit::CreateNewFieldItem(QTreeWidgetItem *_parent) | 1566 | void RegEdit::FillNodeTreeItem(QTreeWidgetItem *item) |
1092 | { | ||
1093 | RegTreeItem *parent = dynamic_cast< RegTreeItem* >(_parent); | ||
1094 | NewFieldTreeItem *newdev_item = new NewFieldTreeItem("New field...", parent->GetRef()); | ||
1095 | MakeItalic(newdev_item, true); | ||
1096 | newdev_item->setIcon(0, QIcon::fromTheme("list-add")); | ||
1097 | parent->addChild(newdev_item); | ||
1098 | } | ||
1099 | |||
1100 | void RegEdit::FillRegTreeItem(QTreeWidgetItem *_item) | ||
1101 | { | ||
1102 | RegTreeItem *item = dynamic_cast< RegTreeItem* >(_item); | ||
1103 | const soc_reg_t& reg = item->GetRef().GetReg(); | ||
1104 | for(size_t i = 0; i < reg.field.size(); i++) | ||
1105 | { | ||
1106 | const soc_reg_field_t& field = reg.field[i]; | ||
1107 | FieldTreeItem *field_item = new FieldTreeItem(QString::fromStdString(field.name), | ||
1108 | SocFieldRef(item->GetRef(), i)); | ||
1109 | FixupEmptyItem(field_item); | ||
1110 | item->addChild(field_item); | ||
1111 | } | ||
1112 | CreateNewFieldItem(item); | ||
1113 | } | ||
1114 | |||
1115 | void RegEdit::CreateNewRegisterItem(QTreeWidgetItem *_parent) | ||
1116 | { | ||
1117 | DevTreeItem *parent = dynamic_cast< DevTreeItem* >(_parent); | ||
1118 | NewRegTreeItem *newdev_item = new NewRegTreeItem("New register...", parent->GetRef()); | ||
1119 | MakeItalic(newdev_item, true); | ||
1120 | newdev_item->setIcon(0, QIcon::fromTheme("list-add")); | ||
1121 | parent->addChild(newdev_item); | ||
1122 | } | ||
1123 | |||
1124 | void RegEdit::FillDevTreeItem(QTreeWidgetItem *_item) | ||
1125 | { | 1567 | { |
1126 | DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item); | 1568 | soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(item); |
1127 | const soc_dev_t& dev = item->GetRef().GetDev(); | 1569 | soc_desc::register_ref_t reg = node.reg(); |
1128 | for(size_t i = 0; i < dev.reg.size(); i++) | 1570 | /* put register if there, otherwise offer to create one */ |
1571 | if(reg.valid() && reg.node() == node) | ||
1129 | { | 1572 | { |
1130 | const soc_reg_t& reg = dev.reg[i]; | 1573 | QTreeWidgetItem *reg_item = MakeSocTreeItem(SocTreeRegType, reg); |
1131 | RegTreeItem *reg_item = new RegTreeItem(QString::fromStdString(reg.name), | 1574 | FixupItem(reg_item); |
1132 | SocRegRef(item->GetRef(), i, -1)); | ||
1133 | FixupEmptyItem(reg_item); | ||
1134 | FillRegTreeItem(reg_item); | ||
1135 | item->addChild(reg_item); | 1575 | item->addChild(reg_item); |
1136 | } | 1576 | } |
1137 | CreateNewRegisterItem(item); | 1577 | std::vector< soc_desc::node_ref_t > list = node.children(); |
1138 | } | 1578 | for(size_t i = 0; i < list.size(); i++) |
1139 | |||
1140 | void RegEdit::CreateNewDeviceItem(QTreeWidgetItem *_parent) | ||
1141 | { | ||
1142 | SocTreeItem *parent = dynamic_cast< SocTreeItem* >(_parent); | ||
1143 | NewDevTreeItem *newdev_item = new NewDevTreeItem("New device...", parent->GetRef()); | ||
1144 | MakeItalic(newdev_item, true); | ||
1145 | newdev_item->setIcon(0, QIcon::fromTheme("list-add")); | ||
1146 | parent->addChild(newdev_item); | ||
1147 | } | ||
1148 | |||
1149 | void RegEdit::FillSocTreeItem(QTreeWidgetItem *_item) | ||
1150 | { | ||
1151 | SocTreeItem *item = dynamic_cast< SocTreeItem* >(_item); | ||
1152 | const soc_t& soc = item->GetRef().GetSoc(); | ||
1153 | for(size_t i = 0; i < soc.dev.size(); i++) | ||
1154 | { | 1579 | { |
1155 | const soc_dev_t& reg = soc.dev[i]; | 1580 | QTreeWidgetItem *node_item = MakeSocTreeItem(SocTreeNodeType, list[i]); |
1156 | DevTreeItem *dev_item = new DevTreeItem(QString::fromStdString(reg.name), | 1581 | FixupItem(node_item); |
1157 | SocDevRef(item->GetRef(), i, -1)); | 1582 | FillNodeTreeItem(node_item); |
1158 | FixupEmptyItem(dev_item); | 1583 | item->addChild(node_item); |
1159 | FillDevTreeItem(dev_item); | ||
1160 | item->addChild(dev_item); | ||
1161 | } | 1584 | } |
1162 | CreateNewDeviceItem(item); | ||
1163 | } | 1585 | } |
1164 | 1586 | ||
1165 | void RegEdit::FillSocTree() | 1587 | void RegEdit::FillSocTree() |
1166 | { | 1588 | { |
1167 | SocRef ref = m_cur_socfile.GetSocRef(); | 1589 | soc_desc::soc_ref_t ref = m_cur_socfile.GetSocRef(); |
1168 | SocTreeItem *soc_item = new SocTreeItem( | 1590 | QTreeWidgetItem *root_item = MakeSocTreeItem(SocTreeSocType, ref.root()); |
1169 | QString::fromStdString(ref.GetSoc().name), ref); | 1591 | FixupItem(root_item); |
1170 | FixupEmptyItem(soc_item); | 1592 | FillNodeTreeItem(root_item); |
1171 | FillSocTreeItem(soc_item); | 1593 | m_soc_tree->addTopLevelItem(root_item); |
1172 | m_soc_tree->addTopLevelItem(soc_item); | 1594 | root_item->setExpanded(true); |
1173 | soc_item->setExpanded(true); | ||
1174 | } | 1595 | } |
1175 | 1596 | ||
1176 | void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it) | 1597 | void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it) |
@@ -1180,17 +1601,46 @@ void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it) | |||
1180 | item->setFont(0, font); | 1601 | item->setFont(0, font); |
1181 | } | 1602 | } |
1182 | 1603 | ||
1183 | void RegEdit::FixupEmptyItem(QTreeWidgetItem *item) | 1604 | QIcon RegEdit::GetIconFromType(int type) |
1605 | { | ||
1606 | switch(type) | ||
1607 | { | ||
1608 | case SocTreeSocType: return QIcon::fromTheme("computer"); | ||
1609 | case SocTreeNodeType: return QIcon::fromTheme("cpu"); | ||
1610 | case SocTreeRegType: return style()->standardIcon(QStyle::SP_ArrowRight); | ||
1611 | default: return QIcon(); | ||
1612 | } | ||
1613 | } | ||
1614 | |||
1615 | bool RegEdit::ValidateName(const QString& name) | ||
1184 | { | 1616 | { |
1185 | if(item->text(0).size() == 0) | 1617 | if(name.size() == 0) |
1618 | return false; | ||
1619 | for(int i = 0; i < name.size(); i++) | ||
1620 | if(!name[i].isLetterOrNumber() && name[i] != QChar('_')) | ||
1621 | return false; | ||
1622 | return true; | ||
1623 | } | ||
1624 | |||
1625 | void RegEdit::FixupItem(QTreeWidgetItem *item) | ||
1626 | { | ||
1627 | UpdateName(item); | ||
1628 | if(!ValidateName(item->text(0))) | ||
1186 | { | 1629 | { |
1187 | item->setIcon(0, QIcon::fromTheme("dialog-error")); | 1630 | item->setIcon(0, QIcon::fromTheme("dialog-error")); |
1188 | MakeItalic(item, true); | 1631 | if(item->text(0).size() == 0) |
1189 | item->setText(0, "Unnamed"); | 1632 | { |
1633 | MakeItalic(item, true); | ||
1634 | item->setText(0, "Unnamed"); | ||
1635 | } | ||
1636 | m_msg_name_error_id = SetMessage(MessageWidget::Error, | ||
1637 | "The item name is invalid. It must be non-empty and consists only " | ||
1638 | "of alphanumerical or underscore characters"); | ||
1190 | } | 1639 | } |
1191 | else | 1640 | else |
1192 | { | 1641 | { |
1193 | item->setIcon(0, QIcon::fromTheme("cpu")); | 1642 | HideMessage(m_msg_name_error_id); |
1643 | item->setIcon(0, GetIconFromType(item->type())); | ||
1194 | MakeItalic(item, false); | 1644 | MakeItalic(item, false); |
1195 | } | 1645 | } |
1196 | } | 1646 | } |
@@ -1206,9 +1656,9 @@ void RegEdit::SetPanel(QWidget *panel) | |||
1206 | { | 1656 | { |
1207 | delete m_right_panel; | 1657 | delete m_right_panel; |
1208 | m_right_panel = panel; | 1658 | m_right_panel = panel; |
1209 | connect(m_right_panel, SIGNAL(OnModified(bool)), this, SLOT(OnSocModified(bool))); | 1659 | connect(m_right_panel, SIGNAL(OnModified()), this, |
1210 | m_splitter->addWidget(m_right_panel); | 1660 | SLOT(OnSocModified())); |
1211 | m_splitter->setStretchFactor(1, 2); | 1661 | m_right_panel_layout->addWidget(m_right_panel, 1); |
1212 | } | 1662 | } |
1213 | 1663 | ||
1214 | void RegEdit::SetModified(bool add, bool mod) | 1664 | void RegEdit::SetModified(bool add, bool mod) |
@@ -1217,15 +1667,33 @@ void RegEdit::SetModified(bool add, bool mod) | |||
1217 | OnModified(mod); | 1667 | OnModified(mod); |
1218 | } | 1668 | } |
1219 | 1669 | ||
1220 | namespace | 1670 | void RegEdit::OnSocItemNew() |
1221 | { | ||
1222 | |||
1223 | template< typename T > | ||
1224 | void my_remove_at(std::vector< T >& v, size_t at) | ||
1225 | { | 1671 | { |
1226 | v.erase(v.begin() + at); | 1672 | QTreeWidgetItem *current = m_soc_tree->currentItem(); |
1673 | if(current == 0) | ||
1674 | return; | ||
1675 | soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(current); | ||
1676 | node = node.create(); | ||
1677 | node.get()->name = "unnamed"; | ||
1678 | QTreeWidgetItem *node_item = MakeSocTreeItem(SocTreeNodeType, node); | ||
1679 | FixupItem(node_item); | ||
1680 | current->addChild(node_item); | ||
1681 | m_soc_tree->setCurrentItem(node_item); | ||
1227 | } | 1682 | } |
1228 | 1683 | ||
1684 | void RegEdit::OnSocItemCreate() | ||
1685 | { | ||
1686 | QTreeWidgetItem *current = m_soc_tree->currentItem(); | ||
1687 | if(current == 0) | ||
1688 | return; | ||
1689 | soc_desc::register_t reg; | ||
1690 | reg.width = 32; | ||
1691 | soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(current); | ||
1692 | node.get()->register_.push_back(reg); | ||
1693 | QTreeWidgetItem *reg_item = MakeSocTreeItem(SocTreeRegType, node.reg()); | ||
1694 | FixupItem(reg_item); | ||
1695 | current->insertChild(0, reg_item); | ||
1696 | m_soc_tree->setCurrentItem(reg_item); | ||
1229 | } | 1697 | } |
1230 | 1698 | ||
1231 | void RegEdit::OnSocItemDelete() | 1699 | void RegEdit::OnSocItemDelete() |
@@ -1242,172 +1710,116 @@ void RegEdit::OnSocItemDelete() | |||
1242 | return; | 1710 | return; |
1243 | if(current->type() == SocTreeSocType) | 1711 | if(current->type() == SocTreeSocType) |
1244 | { | 1712 | { |
1245 | SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); | 1713 | SocTreeItemVal< soc_desc::node_ref_t >(current).remove(); |
1246 | item->GetRef().GetSoc().dev.clear(); | 1714 | current->takeChildren(); |
1247 | item->takeChildren(); | 1715 | OnSocModified(); |
1248 | FillSocTreeItem(item); | ||
1249 | m_soc_tree->expandItem(item); | ||
1250 | } | 1716 | } |
1251 | else if(current->type() == SocTreeDevType) | 1717 | else if(current->type() == SocTreeNodeType) |
1252 | { | 1718 | { |
1253 | DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); | 1719 | SocTreeItemVal< soc_desc::node_ref_t >(current).remove(); |
1254 | my_remove_at(item->GetRef().GetSoc().dev, item->GetRef().GetDevIndex()); | 1720 | current->parent()->removeChild(current); |
1255 | QTreeWidgetItem *parent = item->parent(); | 1721 | OnSocModified(); |
1256 | parent->takeChildren(); | ||
1257 | FillSocTreeItem(parent); | ||
1258 | m_soc_tree->expandItem(parent); | ||
1259 | } | 1722 | } |
1260 | else if(current->type() == SocTreeRegType) | 1723 | else if(current->type() == SocTreeRegType) |
1261 | { | 1724 | { |
1262 | RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); | 1725 | SocTreeItemVal< soc_desc::register_ref_t >(current).remove(); |
1263 | my_remove_at(item->GetRef().GetDev().reg, item->GetRef().GetRegIndex()); | 1726 | current->parent()->removeChild(current); |
1264 | QTreeWidgetItem *parent = item->parent(); | 1727 | OnSocModified(); |
1265 | parent->takeChildren(); | ||
1266 | FillDevTreeItem(parent); | ||
1267 | m_soc_tree->expandItem(parent); | ||
1268 | } | ||
1269 | else if(current->type() == SocTreeFieldType) | ||
1270 | { | ||
1271 | FieldTreeItem *item = dynamic_cast< FieldTreeItem * >(current); | ||
1272 | my_remove_at(item->GetRef().GetReg().field, item->GetRef().GetFieldIndex()); | ||
1273 | QTreeWidgetItem *parent = item->parent(); | ||
1274 | parent->takeChildren(); | ||
1275 | FillRegTreeItem(parent); | ||
1276 | m_soc_tree->expandItem(parent); | ||
1277 | } | 1728 | } |
1278 | } | 1729 | } |
1279 | 1730 | ||
1280 | void RegEdit::OnSocModified(bool modified) | 1731 | void RegEdit::OnSocModified() |
1281 | { | 1732 | { |
1282 | // we might need to update the name in the tree | 1733 | // we might need to update the name in the tree |
1283 | UpdateName(m_soc_tree->currentItem()); | 1734 | FixupItem(m_soc_tree->currentItem()); |
1284 | if(modified) | 1735 | SetModified(true, true); |
1285 | SetModified(true, true); | ||
1286 | } | 1736 | } |
1287 | 1737 | ||
1288 | void RegEdit::DisplaySoc(SocRef ref) | 1738 | void RegEdit::DisplaySoc(const soc_desc::soc_ref_t& ref) |
1289 | { | 1739 | { |
1290 | SetPanel(new SocEditPanel(ref, this)); | 1740 | SetPanel(new SocEditPanel(ref, this)); |
1291 | } | 1741 | } |
1292 | 1742 | ||
1293 | void RegEdit::DisplayDev(SocDevRef ref) | 1743 | void RegEdit::DisplayNode(const soc_desc::node_ref_t& ref) |
1294 | { | 1744 | { |
1295 | SetPanel(new DevEditPanel(ref, this)); | 1745 | SetPanel(new NodeEditPanel(ref, this)); |
1296 | } | 1746 | } |
1297 | 1747 | ||
1298 | void RegEdit::DisplayReg(SocRegRef ref) | 1748 | void RegEdit::DisplayReg(const soc_desc::register_ref_t& ref) |
1299 | { | 1749 | { |
1300 | SetPanel(new RegEditPanel(ref, this)); | 1750 | SetPanel(new RegEditPanel(ref, this)); |
1301 | } | 1751 | } |
1302 | 1752 | ||
1303 | void RegEdit::DisplayField(SocFieldRef ref) | ||
1304 | { | ||
1305 | SetPanel(new FieldEditPanel(ref, this)); | ||
1306 | } | ||
1307 | |||
1308 | void RegEdit::UpdateName(QTreeWidgetItem *current) | 1753 | void RegEdit::UpdateName(QTreeWidgetItem *current) |
1309 | { | 1754 | { |
1310 | if(current == 0) | 1755 | if(current == 0) |
1311 | return; | 1756 | return; |
1757 | |||
1312 | if(current->type() == SocTreeSocType) | 1758 | if(current->type() == SocTreeSocType) |
1313 | { | 1759 | { |
1314 | SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); | 1760 | current->setText(0, QString::fromStdString( |
1315 | item->setText(0, QString::fromStdString(item->GetRef().GetSoc().name)); | 1761 | SocTreeItemVal< soc_desc::node_ref_t >(current).soc().get()->name)); |
1316 | } | 1762 | } |
1317 | else if(current->type() == SocTreeDevType) | 1763 | else if(current->type() == SocTreeNodeType) |
1318 | { | 1764 | { |
1319 | DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); | 1765 | current->setText(0, QString::fromStdString( |
1320 | item->setText(0, QString::fromStdString(item->GetRef().GetDev().name)); | 1766 | SocTreeItemVal< soc_desc::node_ref_t >(current).get()->name)); |
1321 | } | 1767 | } |
1322 | else if(current->type() == SocTreeRegType) | 1768 | else if(current->type() == SocTreeRegType) |
1323 | { | 1769 | { |
1324 | RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); | 1770 | current->setText(0, "register"); |
1325 | item->setText(0, QString::fromStdString(item->GetRef().GetReg().name)); | ||
1326 | } | ||
1327 | else if(current->type() == SocTreeFieldType) | ||
1328 | { | ||
1329 | FieldTreeItem *item = dynamic_cast< FieldTreeItem * >(current); | ||
1330 | item->setText(0, QString::fromStdString(item->GetRef().GetField().name)); | ||
1331 | } | 1771 | } |
1332 | FixupEmptyItem(current); | ||
1333 | } | 1772 | } |
1334 | 1773 | ||
1335 | void RegEdit::OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) | 1774 | void RegEdit::OnSocTreeContextMenu(QPoint point) |
1336 | { | 1775 | { |
1337 | Q_UNUSED(previous); | 1776 | HideMessage(m_msg_welcome_id); |
1338 | if(current == 0) | 1777 | QTreeWidgetItem *item = m_soc_tree->itemAt(point); |
1778 | if(item == 0) | ||
1339 | return; | 1779 | return; |
1340 | if(current->type() == SocTreeSocType) | 1780 | /* customise messages with item */ |
1341 | { | 1781 | m_action_item = item; |
1342 | SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); | 1782 | QMenu *menu = new QMenu(this); |
1343 | DisplaySoc(item->GetRef()); | 1783 | switch(item->type()) |
1344 | } | ||
1345 | else if(current->type() == SocTreeDevType) | ||
1346 | { | 1784 | { |
1347 | DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); | 1785 | case SocTreeSocType: |
1348 | DisplayDev(item->GetRef()); | 1786 | m_new_action->setText("New node..."); |
1349 | } | 1787 | m_delete_action->setText("Delete all nodes..."); |
1350 | else if(current->type() == SocTreeRegType) | 1788 | menu->addAction(m_new_action); |
1351 | { | 1789 | menu->addAction(m_delete_action); |
1352 | RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); | 1790 | break; |
1353 | DisplayReg(item->GetRef()); | 1791 | case SocTreeNodeType: |
1354 | } | 1792 | { |
1355 | else if(current->type() == SocTreeFieldType) | 1793 | m_new_action->setText("New node..."); |
1356 | { | 1794 | m_delete_action->setText("Delete node..."); |
1357 | FieldTreeItem *item = dynamic_cast< FieldTreeItem * >(current); | 1795 | soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(item); |
1358 | DisplayField(item->GetRef()); | 1796 | if(node.reg().node() != node) |
1797 | menu->addAction(m_create_action); | ||
1798 | menu->addAction(m_new_action); | ||
1799 | menu->addAction(m_delete_action); | ||
1800 | break; | ||
1801 | } | ||
1802 | case SocTreeRegType: | ||
1803 | m_delete_action->setText("Delete register..."); | ||
1804 | menu->addAction(m_new_action); | ||
1805 | menu->addAction(m_delete_action); | ||
1806 | break; | ||
1359 | } | 1807 | } |
1808 | menu->popup(m_soc_tree->viewport()->mapToGlobal(point)); | ||
1360 | } | 1809 | } |
1361 | 1810 | ||
1362 | void RegEdit::OnSocItemActivated(QTreeWidgetItem *current, int column) | 1811 | void RegEdit::OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) |
1363 | { | 1812 | { |
1364 | Q_UNUSED(column); | 1813 | Q_UNUSED(previous); |
1814 | HideMessage(m_msg_welcome_id); | ||
1365 | if(current == 0) | 1815 | if(current == 0) |
1366 | return; | 1816 | return; |
1367 | if(current->type() == SocTreeNewDevType) | 1817 | if(current->type() == SocTreeSocType) |
1368 | AddDevice(current); | 1818 | DisplaySoc(SocTreeItemVal< soc_desc::node_ref_t >(current).soc()); |
1369 | else if(current->type() == SocTreeNewRegType) | 1819 | else if(current->type() == SocTreeNodeType) |
1370 | AddRegister(current); | 1820 | DisplayNode(SocTreeItemVal< soc_desc::node_ref_t >(current)); |
1371 | else if(current->type() == SocTreeNewFieldType) | 1821 | else if(current->type() == SocTreeRegType) |
1372 | AddField(current); | 1822 | DisplayReg(SocTreeItemVal< soc_desc::register_ref_t >(current)); |
1373 | } | ||
1374 | |||
1375 | void RegEdit::AddDevice(QTreeWidgetItem *_item) | ||
1376 | { | ||
1377 | NewDevTreeItem *item = dynamic_cast< NewDevTreeItem * >(_item); | ||
1378 | item->GetRef().GetSoc().dev.push_back(soc_dev_t()); | ||
1379 | DevTreeItem *dev_item = new DevTreeItem("", | ||
1380 | SocDevRef(item->GetRef(), item->GetRef().GetSoc().dev.size() - 1, -1)); | ||
1381 | FixupEmptyItem(dev_item); | ||
1382 | item->parent()->insertChild(item->parent()->indexOfChild(item), dev_item); | ||
1383 | CreateNewRegisterItem(dev_item); | ||
1384 | m_soc_tree->setCurrentItem(dev_item); | ||
1385 | OnModified(true); | ||
1386 | } | ||
1387 | |||
1388 | void RegEdit::AddRegister(QTreeWidgetItem *_item) | ||
1389 | { | ||
1390 | NewRegTreeItem *item = dynamic_cast< NewRegTreeItem * >(_item); | ||
1391 | item->GetRef().GetDev().reg.push_back(soc_reg_t()); | ||
1392 | RegTreeItem *reg_item = new RegTreeItem("", | ||
1393 | SocRegRef(item->GetRef(), item->GetRef().GetDev().reg.size() - 1, -1)); | ||
1394 | FixupEmptyItem(reg_item); | ||
1395 | item->parent()->insertChild(item->parent()->indexOfChild(item), reg_item); | ||
1396 | CreateNewFieldItem(reg_item); | ||
1397 | m_soc_tree->setCurrentItem(reg_item); | ||
1398 | OnModified(true); | ||
1399 | } | ||
1400 | |||
1401 | void RegEdit::AddField(QTreeWidgetItem *_item) | ||
1402 | { | ||
1403 | NewFieldTreeItem *item = dynamic_cast< NewFieldTreeItem * >(_item); | ||
1404 | item->GetRef().GetReg().field.push_back(soc_reg_field_t()); | ||
1405 | FieldTreeItem *field_item = new FieldTreeItem("", | ||
1406 | SocFieldRef(item->GetRef(), item->GetRef().GetReg().field.size() - 1)); | ||
1407 | FixupEmptyItem(field_item); | ||
1408 | item->parent()->insertChild(item->parent()->indexOfChild(item), field_item); | ||
1409 | m_soc_tree->setCurrentItem(field_item); | ||
1410 | OnModified(true); | ||
1411 | } | 1823 | } |
1412 | 1824 | ||
1413 | bool RegEdit::Quit() | 1825 | bool RegEdit::Quit() |
diff --git a/utils/regtools/qeditor/regedit.h b/utils/regtools/qeditor/regedit.h index c56f0d9026..2540500f29 100644 --- a/utils/regtools/qeditor/regedit.h +++ b/utils/regtools/qeditor/regedit.h | |||
@@ -38,6 +38,8 @@ | |||
38 | #include <QButtonGroup> | 38 | #include <QButtonGroup> |
39 | #include <QDebug> | 39 | #include <QDebug> |
40 | #include <QScrollArea> | 40 | #include <QScrollArea> |
41 | #include <QSpinBox> | ||
42 | #include <QFormLayout> | ||
41 | #include "backend.h" | 43 | #include "backend.h" |
42 | #include "settings.h" | 44 | #include "settings.h" |
43 | #include "mainwindow.h" | 45 | #include "mainwindow.h" |
@@ -48,7 +50,7 @@ class AbstractRegEditPanel | |||
48 | public: | 50 | public: |
49 | AbstractRegEditPanel() {} | 51 | AbstractRegEditPanel() {} |
50 | virtual ~AbstractRegEditPanel() {} | 52 | virtual ~AbstractRegEditPanel() {} |
51 | virtual void OnModified(bool mod) = 0; | 53 | virtual void OnModified() = 0; |
52 | }; | 54 | }; |
53 | 55 | ||
54 | class EmptyEditPanel : public QWidget, public AbstractRegEditPanel | 56 | class EmptyEditPanel : public QWidget, public AbstractRegEditPanel |
@@ -58,7 +60,7 @@ public: | |||
58 | EmptyEditPanel(QWidget *parent); | 60 | EmptyEditPanel(QWidget *parent); |
59 | 61 | ||
60 | signals: | 62 | signals: |
61 | void OnModified(bool mod); | 63 | void OnModified(); |
62 | 64 | ||
63 | protected: | 65 | protected: |
64 | }; | 66 | }; |
@@ -67,178 +69,167 @@ class SocEditPanel : public QWidget, public AbstractRegEditPanel | |||
67 | { | 69 | { |
68 | Q_OBJECT | 70 | Q_OBJECT |
69 | public: | 71 | public: |
70 | SocEditPanel(SocRef ref, QWidget *parent = 0); | 72 | SocEditPanel(const soc_desc::soc_ref_t& ref, QWidget *parent = 0); |
71 | 73 | ||
72 | signals: | 74 | signals: |
73 | void OnModified(bool mod); | 75 | void OnModified(); |
74 | 76 | ||
75 | protected slots: | 77 | protected slots: |
76 | void OnTextEdited(); | 78 | void OnTextEdited(); |
77 | void OnNameEdited(const QString& text); | 79 | void OnNameEdited(const QString& text); |
80 | void OnTitleEdited(const QString& text); | ||
81 | void OnVersionEdited(const QString& text); | ||
82 | void OnIsaEdited(const QString& text); | ||
83 | void OnAuthorActivated(QTableWidgetItem *); | ||
84 | void OnAuthorChanged(QTableWidgetItem *); | ||
78 | 85 | ||
79 | protected: | 86 | protected: |
80 | SocRef m_ref; | 87 | soc_desc::soc_ref_t m_ref; |
81 | QGroupBox *m_name_group; | 88 | QTableWidget *m_authors_list; |
82 | QLineEdit *m_name_edit; | ||
83 | QGroupBox *m_desc_group; | ||
84 | MyTextEditor *m_desc_edit; | 89 | MyTextEditor *m_desc_edit; |
85 | }; | 90 | }; |
86 | 91 | ||
87 | class DevEditPanel : public QWidget, public AbstractRegEditPanel | 92 | class NodeInstanceEditPanel : public QWidget |
88 | { | 93 | { |
89 | Q_OBJECT | 94 | Q_OBJECT |
90 | public: | 95 | public: |
91 | DevEditPanel(SocDevRef ref, QWidget *parent = 0); | 96 | NodeInstanceEditPanel(const soc_desc::node_ref_t& ref, soc_id_t inst_id, |
97 | QWidget *parent = 0); | ||
98 | soc_id_t GetId(); | ||
99 | soc_desc::instance_t& GetInstance(); | ||
92 | 100 | ||
93 | signals: | 101 | signals: |
94 | void OnModified(bool mod); | 102 | void OnModified(); |
95 | 103 | ||
96 | protected slots: | 104 | protected slots: |
97 | void OnInstActivated(int row, int column); | ||
98 | void OnInstChanged(int row, int column); | ||
99 | void OnNameEdited(const QString& text); | 105 | void OnNameEdited(const QString& text); |
100 | void OnLongNameEdited(const QString& text); | 106 | void OnTitleEdited(const QString& text); |
101 | void OnVersionEdited(const QString& text); | 107 | void OnDescEdited(const QString& text); |
102 | void OnDescEdited(); | 108 | void OnTypeChanged(int index); |
109 | void OnAddrChanged(uint addr); | ||
110 | void OnBaseChanged(uint base); | ||
111 | void OnStrideChanged(uint stride); | ||
112 | void OnFirstChanged(int first); | ||
113 | void OnCountChanged(int count); | ||
114 | void OnFormulaChanged(const QString& formula); | ||
115 | void OnVariableChanged(const QString& variable); | ||
116 | void OnAddressActivated(QTableWidgetItem *); | ||
117 | void OnAddressChanged(QTableWidgetItem *); | ||
103 | 118 | ||
104 | protected: | 119 | protected: |
105 | void FillRow(int row, const soc_dev_addr_t& addr); | 120 | void UpdateType(int type); |
106 | void CreateNewRow(int row); | 121 | |
107 | 122 | soc_desc::node_ref_t m_ref; | |
108 | enum | 123 | soc_id_t m_id; |
109 | { | 124 | QComboBox *m_type_combo; |
110 | DevInstDeleteType = QTableWidgetItem::UserType, | 125 | QWidget *m_single_group; |
111 | DevInstNewType | 126 | QWidget *m_range_group; |
112 | }; | 127 | QWidget *m_formula_group; |
113 | 128 | QWidget *m_stride_group; | |
114 | enum | 129 | QWidget *m_list_group; |
115 | { | 130 | QStyledItemDelegate *m_table_delegate; |
116 | DevInstIconColumn = 0, | 131 | SocFieldEditorCreator *m_table_edit_factory; |
117 | DevInstNameColumn = 1, | ||
118 | DevInstAddrColumn = 2, | ||
119 | }; | ||
120 | |||
121 | SocDevRef m_ref; | ||
122 | QGroupBox *m_name_group; | ||
123 | QLineEdit *m_name_edit; | ||
124 | QGroupBox *m_long_name_group; | ||
125 | QLineEdit *m_long_name_edit; | ||
126 | QGroupBox *m_version_group; | ||
127 | QLineEdit *m_version_edit; | ||
128 | QGroupBox *m_instances_group; | ||
129 | QTableWidget *m_instances_table; | ||
130 | QGroupBox *m_desc_group; | ||
131 | MyTextEditor *m_desc_edit; | ||
132 | }; | 132 | }; |
133 | 133 | ||
134 | class RegEditPanel : public QWidget, public AbstractRegEditPanel | 134 | class NodeEditPanel : public QWidget, public AbstractRegEditPanel |
135 | { | 135 | { |
136 | Q_OBJECT | 136 | Q_OBJECT |
137 | public: | 137 | public: |
138 | RegEditPanel(SocRegRef ref, QWidget *parent = 0); | 138 | NodeEditPanel(const soc_desc::node_ref_t& ref, QWidget *parent = 0); |
139 | 139 | ||
140 | signals: | 140 | signals: |
141 | void OnModified(bool mod); | 141 | void OnModified(); |
142 | 142 | ||
143 | protected slots: | 143 | protected slots: |
144 | void OnInstActivated(int row, int column); | ||
145 | void OnInstChanged(int row, int column); | ||
146 | void OnNameEdited(const QString& text); | 144 | void OnNameEdited(const QString& text); |
145 | void OnTitleEdited(const QString& text); | ||
147 | void OnDescEdited(); | 146 | void OnDescEdited(); |
148 | void OnSctEdited(int state); | 147 | void OnInstRemove(int index); |
149 | void OnFormulaChanged(int index); | 148 | void OnInstCreate(); |
150 | void OnFormulaStringChanged(const QString& text); | 149 | void OnInstModified(); |
151 | void OnFormulaGenerate(bool checked); | 150 | |
151 | protected: | ||
152 | soc_desc::instance_t *GetInstanceById(soc_id_t id); | ||
153 | soc_desc::instance_t *GetInstanceByRow(int row); | ||
154 | QString GuessName(); | ||
155 | |||
156 | soc_desc::node_ref_t m_ref; | ||
157 | MyTextEditor *m_desc_edit; | ||
158 | YTabWidget *m_instances_tab; | ||
159 | }; | ||
160 | |||
161 | class RegFieldEditPanel : public QWidget | ||
162 | { | ||
163 | Q_OBJECT | ||
164 | public: | ||
165 | RegFieldEditPanel(const soc_desc::field_ref_t& ref, QWidget *parent = 0); | ||
166 | soc_desc::field_ref_t GetField(); | ||
167 | void UpdateWidth(); | ||
168 | |||
169 | signals: | ||
170 | void OnModified(); | ||
171 | |||
172 | protected slots: | ||
173 | void OnFieldNameChanged(const QString& name); | ||
174 | void OnFieldRangeChanged(const QString& range); | ||
175 | void OnFieldDescChanged(const QString& name); | ||
176 | void OnFieldValueActivated(QTableWidgetItem *item); | ||
177 | void OnFieldValueChanged(QTableWidgetItem *item); | ||
152 | 178 | ||
153 | protected: | 179 | protected: |
154 | void CreateNewAddrRow(int row); | 180 | |
155 | void FillRow(int row, const soc_reg_addr_t& addr); | 181 | soc_desc::field_ref_t m_ref; |
156 | void UpdateFormula(); | ||
157 | void UpdateWarning(int row); | ||
158 | |||
159 | enum | ||
160 | { | ||
161 | RegInstDeleteType = QTableWidgetItem::UserType, | ||
162 | RegInstNewType | ||
163 | }; | ||
164 | |||
165 | enum | ||
166 | { | ||
167 | RegInstIconColumn = 0, | ||
168 | RegInstNameColumn, | ||
169 | RegInstAddrColumn, | ||
170 | RegInstNrColumns, | ||
171 | }; | ||
172 | |||
173 | SocRegRef m_ref; | ||
174 | QGroupBox *m_name_group; | ||
175 | QLineEdit *m_name_edit; | 182 | QLineEdit *m_name_edit; |
176 | QGroupBox *m_instances_group; | 183 | QLineEdit *m_range_edit; |
177 | QTableWidget *m_instances_table; | 184 | SocBitRangeValidator *m_range_validator; |
178 | QGroupBox *m_desc_group; | ||
179 | QGroupBox *m_flags_group; | ||
180 | QCheckBox *m_sct_check; | ||
181 | QFont m_reg_font; | ||
182 | QGroupBox *m_formula_group; | ||
183 | QButtonGroup *m_formula_radio_group; | ||
184 | QLabel *m_formula_type_label; | ||
185 | QComboBox *m_formula_combo; | ||
186 | QLineEdit *m_formula_string_edit; | ||
187 | QPushButton *m_formula_string_gen; | ||
188 | Unscroll< RegSexyDisplay2 > *m_sexy_display2; | ||
189 | MyTextEditor *m_desc_edit; | 185 | MyTextEditor *m_desc_edit; |
190 | QGroupBox *m_field_group; | 186 | QTableWidget *m_enum_table; |
191 | QTableView *m_value_table; | 187 | SocFieldItemDelegate *m_enum_delegate; |
192 | RegFieldTableModel *m_value_model; | 188 | SocFieldEditorCreator *m_enum_editor; |
193 | QStyledItemDelegate *m_table_delegate; | ||
194 | }; | 189 | }; |
195 | 190 | ||
196 | class FieldEditPanel : public QWidget, public AbstractRegEditPanel | 191 | class RegEditPanel : public QWidget, public AbstractRegEditPanel |
197 | { | 192 | { |
198 | Q_OBJECT | 193 | Q_OBJECT |
199 | public: | 194 | public: |
200 | FieldEditPanel(SocFieldRef ref, QWidget *parent = 0); | 195 | RegEditPanel(const soc_desc::register_ref_t& ref, QWidget *parent = 0); |
201 | 196 | ||
202 | signals: | 197 | signals: |
203 | void OnModified(bool mod); | 198 | void OnModified(); |
204 | 199 | ||
205 | protected slots: | 200 | protected slots: |
201 | void OnRegFieldActivated(const QModelIndex& index); | ||
202 | void OnRegDisplayContextMenu(QPoint point); | ||
203 | void OnRegFieldDelete(); | ||
204 | void OnRegFieldNew(); | ||
205 | void OnWidthChanged(int size); | ||
206 | void OnFieldModified(); | ||
206 | void OnDescEdited(); | 207 | void OnDescEdited(); |
207 | void OnNameEdited(const QString& text); | 208 | void OnVariantActivated(QTableWidgetItem *item); |
208 | void OnBitRangeEdited(const QString& string); | 209 | void OnVariantValueChanged(QTableWidgetItem *item); |
209 | void OnValueActivated(int row, int column); | 210 | void OnFieldRemove(int index); |
210 | void OnValueChanged(int row, int column); | 211 | void OnFieldCreate(); |
211 | 212 | ||
212 | protected: | 213 | protected: |
213 | void CreateNewRow(int row); | 214 | void DoModify(); |
214 | void FillRow(int row, const soc_reg_field_value_t& val); | 215 | int FindFreeBit(int preferred); |
215 | void UpdateWarning(int row); | 216 | int IndexById(soc_id_t id); // tab index |
216 | void UpdateDelegates(); | 217 | void UpdateWidthRestrictions(); |
217 | 218 | ||
218 | enum | ||
219 | { | ||
220 | FieldValueDeleteType = QTableWidgetItem::UserType, | ||
221 | FieldValueNewType, | ||
222 | }; | ||
223 | |||
224 | enum | ||
225 | { | ||
226 | FieldValueIconColumn = 0, | ||
227 | FieldValueNameColumn, | ||
228 | FieldValueValueColumn, | ||
229 | FieldValueDescColumn, | ||
230 | FieldValueNrColumns, | ||
231 | }; | ||
232 | |||
233 | SocFieldRef m_ref; | ||
234 | QGroupBox *m_name_group; | ||
235 | QLineEdit *m_name_edit; | ||
236 | QGroupBox *m_bitrange_group; | ||
237 | QLineEdit *m_bitrange_edit; | ||
238 | QGroupBox *m_desc_group; | ||
239 | MyTextEditor *m_desc_edit; | 219 | MyTextEditor *m_desc_edit; |
240 | QGroupBox *m_value_group; | 220 | soc_desc::register_ref_t m_ref; |
241 | QTableWidget *m_value_table; | 221 | QFont m_reg_font; |
222 | Unscroll< YRegDisplay > *m_sexy_display2; | ||
223 | RegFieldTableModel *m_value_model; | ||
224 | YTabWidget *m_fields_tab; | ||
225 | QTabWidget *m_view_tab; | ||
226 | QTableWidget *m_variant_table; | ||
227 | QAction *m_new_action; | ||
228 | QAction *m_delete_action; | ||
229 | QPoint m_menu_point; | ||
230 | SocFieldItemDelegate *m_variant_delegate; | ||
231 | SocFieldEditorCreator *m_variant_editor; | ||
232 | QButtonGroup *m_reg_size_group; | ||
242 | }; | 233 | }; |
243 | 234 | ||
244 | class RegEdit : public QWidget, public DocumentTab | 235 | class RegEdit : public QWidget, public DocumentTab |
@@ -252,43 +243,50 @@ public: | |||
252 | 243 | ||
253 | protected slots: | 244 | protected slots: |
254 | void OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); | 245 | void OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); |
255 | void OnSocItemActivated(QTreeWidgetItem *current, int column); | ||
256 | void OnOpen(); | 246 | void OnOpen(); |
257 | void OnSave(); | 247 | void OnSave(); |
258 | void OnSaveAs(); | 248 | void OnSaveAs(); |
259 | void OnSocModified(bool modified); | 249 | void OnSocModified(); |
260 | void OnNew(); | 250 | void OnNew(); |
261 | void OnSocItemDelete(); | 251 | void OnSocItemDelete(); |
252 | void OnSocItemNew(); | ||
253 | void OnSocItemCreate(); | ||
254 | void OnSocTreeContextMenu(QPoint point); | ||
262 | 255 | ||
263 | protected: | 256 | protected: |
264 | void LoadSocFile(const QString& filename); | 257 | void LoadSocFile(const QString& filename); |
265 | void UpdateSocFile(); | 258 | void UpdateSocFile(); |
266 | void FillSocTree(); | 259 | void FillSocTree(); |
267 | void FillSocTreeItem(QTreeWidgetItem *_item); | 260 | void FillNodeTreeItem(QTreeWidgetItem *item); |
268 | void FillDevTreeItem(QTreeWidgetItem *_item); | ||
269 | void FillRegTreeItem(QTreeWidgetItem *_item); | ||
270 | void SetPanel(QWidget *panel); | 261 | void SetPanel(QWidget *panel); |
271 | void DisplaySoc(SocRef ref); | 262 | void DisplaySoc(const soc_desc::soc_ref_t& ref); |
272 | void DisplayDev(SocDevRef ref); | 263 | void DisplayNode(const soc_desc::node_ref_t& ref); |
273 | void DisplayReg(SocRegRef ref); | 264 | void DisplayReg(const soc_desc::register_ref_t& ref); |
274 | void DisplayField(SocFieldRef ref); | ||
275 | bool CloseSoc(); | 265 | bool CloseSoc(); |
276 | bool SaveSoc(); | 266 | bool SaveSoc(); |
277 | bool SaveSocAs(); | 267 | bool SaveSocAs(); |
278 | bool SaveSocFile(const QString& filename); | 268 | bool SaveSocFile(const QString& filename); |
279 | bool GetFilename(QString& filename, bool save); | 269 | bool GetFilename(QString& filename, bool save); |
280 | void SetModified(bool add, bool mod); | 270 | void SetModified(bool add, bool mod); |
281 | void FixupEmptyItem(QTreeWidgetItem *item); | 271 | void FixupItem(QTreeWidgetItem *item); |
272 | QIcon GetIconFromType(int type); | ||
282 | void MakeItalic(QTreeWidgetItem *item, bool it); | 273 | void MakeItalic(QTreeWidgetItem *item, bool it); |
283 | void AddDevice(QTreeWidgetItem *item); | 274 | void AddDevice(QTreeWidgetItem *item); |
284 | void AddRegister(QTreeWidgetItem *_item); | 275 | void AddRegister(QTreeWidgetItem *_item); |
285 | void UpdateName(QTreeWidgetItem *current); | 276 | void UpdateName(QTreeWidgetItem *current); |
286 | void AddField(QTreeWidgetItem *_item); | 277 | void AddField(QTreeWidgetItem *_item); |
287 | void CreateNewDeviceItem(QTreeWidgetItem *parent); | 278 | void CreateNewNodeItem(QTreeWidgetItem *parent); |
288 | void CreateNewRegisterItem(QTreeWidgetItem *parent); | 279 | void CreateNewRegisterItem(QTreeWidgetItem *parent); |
289 | void CreateNewFieldItem(QTreeWidgetItem *parent); | 280 | void CreateNewFieldItem(QTreeWidgetItem *parent); |
290 | void UpdateTabName(); | 281 | void UpdateTabName(); |
291 | 282 | bool ValidateName(const QString& name); | |
283 | int SetMessage(MessageWidget::MessageType type, const QString& msg); | ||
284 | void HideMessage(int id); | ||
285 | |||
286 | QAction *m_delete_action; | ||
287 | QAction *m_new_action; | ||
288 | QAction *m_create_action; | ||
289 | QTreeWidgetItem *m_action_item; | ||
292 | QGroupBox *m_file_group; | 290 | QGroupBox *m_file_group; |
293 | QToolButton *m_file_open; | 291 | QToolButton *m_file_open; |
294 | QToolButton *m_file_save; | 292 | QToolButton *m_file_save; |
@@ -299,6 +297,10 @@ protected: | |||
299 | bool m_modified; | 297 | bool m_modified; |
300 | SocFile m_cur_socfile; | 298 | SocFile m_cur_socfile; |
301 | QWidget *m_right_panel; | 299 | QWidget *m_right_panel; |
300 | MessageWidget *m_msg; | ||
301 | QVBoxLayout *m_right_panel_layout; | ||
302 | int m_msg_welcome_id; | ||
303 | int m_msg_name_error_id; | ||
302 | }; | 304 | }; |
303 | 305 | ||
304 | #endif /* REGEDIT_H */ | 306 | #endif /* REGEDIT_H */ |
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp index a82070e3f8..2653908d41 100644 --- a/utils/regtools/qeditor/regtab.cpp +++ b/utils/regtools/qeditor/regtab.cpp | |||
@@ -35,42 +35,7 @@ namespace | |||
35 | 35 | ||
36 | enum | 36 | enum |
37 | { | 37 | { |
38 | RegTreeDevType = QTreeWidgetItem::UserType, | 38 | NodeInstRole = Qt::UserRole, |
39 | RegTreeRegType, | ||
40 | RegTreeSocType | ||
41 | }; | ||
42 | |||
43 | class SocTreeItem : public QTreeWidgetItem | ||
44 | { | ||
45 | public: | ||
46 | SocTreeItem(const QString& string, const SocRef& ref) | ||
47 | :QTreeWidgetItem(QStringList(string), RegTreeSocType), m_ref(ref) {} | ||
48 | |||
49 | const SocRef& GetRef() { return m_ref; } | ||
50 | private: | ||
51 | SocRef m_ref; | ||
52 | }; | ||
53 | |||
54 | class DevTreeItem : public QTreeWidgetItem | ||
55 | { | ||
56 | public: | ||
57 | DevTreeItem(const QString& string, const SocDevRef& ref) | ||
58 | :QTreeWidgetItem(QStringList(string), RegTreeDevType), m_ref(ref) {} | ||
59 | |||
60 | const SocDevRef& GetRef() { return m_ref; } | ||
61 | private: | ||
62 | SocDevRef m_ref; | ||
63 | }; | ||
64 | |||
65 | class RegTreeItem : public QTreeWidgetItem | ||
66 | { | ||
67 | public: | ||
68 | RegTreeItem(const QString& string, const SocRegRef& ref) | ||
69 | :QTreeWidgetItem(QStringList(string), RegTreeRegType), m_ref(ref) {} | ||
70 | |||
71 | const SocRegRef& GetRef() { return m_ref; } | ||
72 | private: | ||
73 | SocRegRef m_ref; | ||
74 | }; | 39 | }; |
75 | 40 | ||
76 | } | 41 | } |
@@ -165,7 +130,8 @@ RegTab::RegTab(Backend *backend, QWidget *parent) | |||
165 | 130 | ||
166 | connect(m_soc_selector, SIGNAL(currentIndexChanged(int)), | 131 | connect(m_soc_selector, SIGNAL(currentIndexChanged(int)), |
167 | this, SLOT(OnSocChanged(int))); | 132 | this, SLOT(OnSocChanged(int))); |
168 | connect(m_backend, SIGNAL(OnSocListChanged()), this, SLOT(OnSocListChanged())); | 133 | connect(m_backend, SIGNAL(OnSocAdded(const SocFileRef&)), this, |
134 | SLOT(OnSocAdded(const SocFileRef&))); | ||
169 | connect(m_reg_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), | 135 | connect(m_reg_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), |
170 | this, SLOT(OnRegItemClicked(QTreeWidgetItem*, int))); | 136 | this, SLOT(OnRegItemClicked(QTreeWidgetItem*, int))); |
171 | connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this, | 137 | connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this, |
@@ -183,7 +149,9 @@ RegTab::RegTab(Backend *backend, QWidget *parent) | |||
183 | "You can browse the registers. Select a data source to analyse the values."); | 149 | "You can browse the registers. Select a data source to analyse the values."); |
184 | m_msg_error_id = 0; | 150 | m_msg_error_id = 0; |
185 | 151 | ||
186 | OnSocListChanged(); | 152 | QList< SocFileRef > socs = m_backend->GetSocFileList(); |
153 | for(int i = 0; i < socs.size(); i++) | ||
154 | OnSocAdded(socs[i]); | ||
187 | SetDataSocName(""); | 155 | SetDataSocName(""); |
188 | UpdateTabName(); | 156 | UpdateTabName(); |
189 | } | 157 | } |
@@ -286,21 +254,7 @@ void RegTab::OnRegItemClicked(QTreeWidgetItem *current, int col) | |||
286 | Q_UNUSED(col); | 254 | Q_UNUSED(col); |
287 | if(current == 0) | 255 | if(current == 0) |
288 | return; | 256 | return; |
289 | if(current->type() == RegTreeSocType) | 257 | DisplayNode(NodeInst(current)); |
290 | { | ||
291 | SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); | ||
292 | DisplaySoc(item->GetRef()); | ||
293 | } | ||
294 | if(current->type() == RegTreeRegType) | ||
295 | { | ||
296 | RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); | ||
297 | DisplayRegister(item->GetRef()); | ||
298 | } | ||
299 | else if(current->type() == RegTreeDevType) | ||
300 | { | ||
301 | DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); | ||
302 | DisplayDevice(item->GetRef()); | ||
303 | } | ||
304 | } | 258 | } |
305 | 259 | ||
306 | void RegTab::OnAnalyserClicked(QListWidgetItem *current) | 260 | void RegTab::OnAnalyserClicked(QListWidgetItem *current) |
@@ -311,19 +265,14 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current) | |||
311 | SetPanel(ana->Create(m_cur_soc, m_io_backend)); | 265 | SetPanel(ana->Create(m_cur_soc, m_io_backend)); |
312 | } | 266 | } |
313 | 267 | ||
314 | void RegTab::DisplayRegister(const SocRegRef& ref) | 268 | void RegTab::DisplayNode(const soc_desc::node_inst_t& ref) |
315 | { | ||
316 | SetPanel(new RegDisplayPanel(this, m_io_backend, ref)); | ||
317 | } | ||
318 | |||
319 | void RegTab::DisplayDevice(const SocDevRef& ref) | ||
320 | { | 269 | { |
321 | SetPanel(new DevDisplayPanel(this, ref)); | 270 | if(ref.node().is_root()) |
322 | } | 271 | SetPanel(new SocDisplayPanel(this, m_io_backend, ref.soc())); |
323 | 272 | else if(ref.node().reg().valid()) | |
324 | void RegTab::DisplaySoc(const SocRef& ref) | 273 | SetPanel(new RegDisplayPanel(this, m_io_backend, ref)); |
325 | { | 274 | else |
326 | SetPanel(new SocDisplayPanel(this, ref)); | 275 | SetPanel(new NodeDisplayPanel(this, m_io_backend, ref)); |
327 | } | 276 | } |
328 | 277 | ||
329 | int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg) | 278 | int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg) |
@@ -344,56 +293,45 @@ void RegTab::SetPanel(RegTabPanel *panel) | |||
344 | m_right_panel->addWidget(m_right_content->GetWidget(), 1); | 293 | m_right_panel->addWidget(m_right_content->GetWidget(), 1); |
345 | } | 294 | } |
346 | 295 | ||
347 | void RegTab::OnSocListChanged() | 296 | void RegTab::OnSocAdded(const SocFileRef& ref) |
348 | { | 297 | { |
349 | m_soc_selector->clear(); | 298 | soc_desc::soc_ref_t soc = ref.GetSocFile()->GetSocRef(); |
350 | QList< SocRef > socs = m_backend->GetSocList(); | 299 | QVariant v; |
351 | for(int i = 0; i < socs.size(); i++) | 300 | v.setValue(soc); |
352 | { | 301 | m_soc_selector->addItem(QString::fromStdString(soc.get()->name), v); |
353 | QVariant v; | ||
354 | v.setValue(socs[i]); | ||
355 | m_soc_selector->addItem(QString::fromStdString(socs[i].GetSoc().name), v); | ||
356 | } | ||
357 | } | 302 | } |
358 | 303 | ||
359 | void RegTab::FillDevSubTree(QTreeWidgetItem *_item) | 304 | QTreeWidgetItem *RegTab::MakeNode(const soc_desc::node_inst_t& inst, const QString& s) |
360 | { | 305 | { |
361 | DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item); | 306 | QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(s)); |
362 | const soc_dev_t& dev = item->GetRef().GetDev(); | 307 | item->setData(0, NodeInstRole, QVariant::fromValue(inst)); |
363 | for(size_t i = 0; i < dev.reg.size(); i++) | 308 | return item; |
364 | { | 309 | } |
365 | const soc_reg_t& reg = dev.reg[i]; | 310 | |
366 | for(size_t j = 0; j < reg.addr.size(); j++) | 311 | soc_desc::node_inst_t RegTab::NodeInst(QTreeWidgetItem *item) |
367 | { | 312 | { |
368 | RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(), | 313 | return item->data(0, NodeInstRole).value< soc_desc::node_inst_t >(); |
369 | SocRegRef(item->GetRef(), i, j)); | ||
370 | item->addChild(reg_item); | ||
371 | } | ||
372 | } | ||
373 | } | 314 | } |
374 | 315 | ||
375 | void RegTab::FillSocSubTree(QTreeWidgetItem *_item) | 316 | void RegTab::FillSubTree(QTreeWidgetItem *item) |
376 | { | 317 | { |
377 | SocTreeItem *item = dynamic_cast< SocTreeItem* >(_item); | 318 | std::vector< soc_desc::node_inst_t > list = NodeInst(item).children(); |
378 | const soc_t& soc = item->GetRef().GetSoc(); | 319 | for(size_t i = 0; i < list.size(); i++) |
379 | for(size_t i = 0; i < soc.dev.size(); i++) | ||
380 | { | 320 | { |
381 | const soc_dev_t& dev = soc.dev[i]; | 321 | QString name = QString::fromStdString(list[i].name()); |
382 | for(size_t j = 0; j < dev.addr.size(); j++) | 322 | if(list[i].is_indexed()) |
383 | { | 323 | name = QString("%1[%2]").arg(name).arg(list[i].index()); |
384 | DevTreeItem *dev_item = new DevTreeItem(dev.addr[j].name.c_str(), | 324 | QTreeWidgetItem *child = MakeNode(list[i], name); |
385 | SocDevRef(m_cur_soc, i, j)); | 325 | FillSubTree(child); |
386 | FillDevSubTree(dev_item); | 326 | item->addChild(child); |
387 | item->addChild(dev_item); | ||
388 | } | ||
389 | } | 327 | } |
390 | } | 328 | } |
391 | 329 | ||
392 | void RegTab::FillRegTree() | 330 | void RegTab::FillRegTree() |
393 | { | 331 | { |
394 | SocTreeItem *soc_item = new SocTreeItem(m_cur_soc.GetSoc().name.c_str(), | 332 | QTreeWidgetItem *soc_item = MakeNode(m_cur_soc.root_inst(), |
395 | m_cur_soc); | 333 | QString::fromStdString(m_cur_soc.get()->name)); |
396 | FillSocSubTree(soc_item); | 334 | FillSubTree(soc_item); |
397 | m_reg_tree->addTopLevelItem(soc_item); | 335 | m_reg_tree->addTopLevelItem(soc_item); |
398 | m_reg_tree->expandItem(soc_item); | 336 | m_reg_tree->expandItem(soc_item); |
399 | } | 337 | } |
@@ -401,7 +339,8 @@ void RegTab::FillRegTree() | |||
401 | void RegTab::FillAnalyserList() | 339 | void RegTab::FillAnalyserList() |
402 | { | 340 | { |
403 | m_analysers_list->clear(); | 341 | m_analysers_list->clear(); |
404 | m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.GetSoc().name.c_str())); | 342 | m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc( |
343 | QString::fromStdString(m_cur_soc.get()->name))); | ||
405 | } | 344 | } |
406 | 345 | ||
407 | void RegTab::OnSocChanged(int index) | 346 | void RegTab::OnSocChanged(int index) |
@@ -409,7 +348,7 @@ void RegTab::OnSocChanged(int index) | |||
409 | if(index == -1) | 348 | if(index == -1) |
410 | return; | 349 | return; |
411 | m_reg_tree->clear(); | 350 | m_reg_tree->clear(); |
412 | m_cur_soc = m_soc_selector->itemData(index).value< SocRef >(); | 351 | m_cur_soc = m_soc_selector->itemData(index).value< soc_desc::soc_ref_t >(); |
413 | FillRegTree(); | 352 | FillRegTree(); |
414 | FillAnalyserList(); | 353 | FillAnalyserList(); |
415 | } | 354 | } |
@@ -426,7 +365,10 @@ void RegTab::OnDumpRegs(bool c) | |||
426 | Q_UNUSED(c); | 365 | Q_UNUSED(c); |
427 | QFileDialog *fd = new QFileDialog(this); | 366 | QFileDialog *fd = new QFileDialog(this); |
428 | fd->setAcceptMode(QFileDialog::AcceptSave); | 367 | fd->setAcceptMode(QFileDialog::AcceptSave); |
429 | fd->setFilter("Textual files (*.txt);;All files (*)"); | 368 | QStringList filters; |
369 | filters << "Textual files (*.txt)"; | ||
370 | filters << "All files (*)"; | ||
371 | fd->setNameFilters(filters); | ||
430 | fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); | 372 | fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); |
431 | if(!fd->exec()) | 373 | if(!fd->exec()) |
432 | return; | 374 | return; |
diff --git a/utils/regtools/qeditor/regtab.h b/utils/regtools/qeditor/regtab.h index a0fd5f305a..b56747f4d1 100644 --- a/utils/regtools/qeditor/regtab.h +++ b/utils/regtools/qeditor/regtab.h | |||
@@ -66,14 +66,13 @@ public: | |||
66 | virtual QWidget *GetWidget(); | 66 | virtual QWidget *GetWidget(); |
67 | 67 | ||
68 | protected: | 68 | protected: |
69 | void FillDevSubTree(QTreeWidgetItem *item); | 69 | QTreeWidgetItem *MakeNode(const soc_desc::node_inst_t& inst, const QString& s); |
70 | void FillSocSubTree(QTreeWidgetItem *item); | 70 | soc_desc::node_inst_t NodeInst(QTreeWidgetItem *item); |
71 | void FillSubTree(QTreeWidgetItem *item); | ||
71 | void FillRegTree(); | 72 | void FillRegTree(); |
72 | void FillAnalyserList(); | 73 | void FillAnalyserList(); |
73 | void UpdateSocList(); | 74 | void UpdateSocList(); |
74 | void DisplayRegister(const SocRegRef& ref); | 75 | void DisplayNode(const soc_desc::node_inst_t& ref); |
75 | void DisplayDevice(const SocDevRef& ref); | ||
76 | void DisplaySoc(const SocRef& ref); | ||
77 | void SetDataSocName(const QString& socname); | 76 | void SetDataSocName(const QString& socname); |
78 | void SetPanel(RegTabPanel *panel); | 77 | void SetPanel(RegTabPanel *panel); |
79 | void UpdateSocFilename(); | 78 | void UpdateSocFilename(); |
@@ -85,7 +84,7 @@ protected: | |||
85 | BackendSelector *m_backend_selector; | 84 | BackendSelector *m_backend_selector; |
86 | Backend *m_backend; | 85 | Backend *m_backend; |
87 | QTreeWidget *m_reg_tree; | 86 | QTreeWidget *m_reg_tree; |
88 | SocRef m_cur_soc; | 87 | soc_desc::soc_ref_t m_cur_soc; |
89 | QVBoxLayout *m_right_panel; | 88 | QVBoxLayout *m_right_panel; |
90 | RegTabPanel *m_right_content; | 89 | RegTabPanel *m_right_content; |
91 | QCheckBox *m_readonly_check; | 90 | QCheckBox *m_readonly_check; |
@@ -102,7 +101,7 @@ protected: | |||
102 | private slots: | 101 | private slots: |
103 | void SetReadOnlyIndicator(); | 102 | void SetReadOnlyIndicator(); |
104 | void OnSocChanged(int index); | 103 | void OnSocChanged(int index); |
105 | void OnSocListChanged(); | 104 | void OnSocAdded(const SocFileRef& ref); |
106 | void OnRegItemClicked(QTreeWidgetItem *clicked, int col); | 105 | void OnRegItemClicked(QTreeWidgetItem *clicked, int col); |
107 | void OnBackendSelect(IoBackend *backend); | 106 | void OnBackendSelect(IoBackend *backend); |
108 | void OnDataChanged(); | 107 | void OnDataChanged(); |
diff --git a/utils/regtools/qeditor/std_analysers.cpp b/utils/regtools/qeditor/std_analysers.cpp index 0fb2050cf0..05a90f9d5b 100644 --- a/utils/regtools/qeditor/std_analysers.cpp +++ b/utils/regtools/qeditor/std_analysers.cpp | |||
@@ -19,13 +19,44 @@ | |||
19 | * | 19 | * |
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include "std_analysers.h" | 21 | #include "std_analysers.h" |
22 | #include <QDebug> | ||
23 | |||
24 | /** | ||
25 | * AnalyserEx | ||
26 | */ | ||
27 | |||
28 | AnalyserEx::AnalyserEx(const soc_desc::soc_ref_t& soc, IoBackend *backend) | ||
29 | :Analyser(soc, backend), m_helper(backend, soc) | ||
30 | { | ||
31 | } | ||
32 | |||
33 | bool AnalyserEx::ReadRegister(const QString& path, soc_word_t& val) | ||
34 | { | ||
35 | return m_helper.ReadRegister(m_helper.ParsePath(path), val); | ||
36 | } | ||
37 | |||
38 | bool AnalyserEx::ReadRegisterOld(const QString& dev, const QString& reg, soc_word_t& val) | ||
39 | { | ||
40 | return ReadRegister(dev + "." + reg, val); | ||
41 | } | ||
42 | |||
43 | bool AnalyserEx::ReadField(const QString& path, const QString& field, soc_word_t& val) | ||
44 | { | ||
45 | return m_helper.ReadRegisterField(m_helper.ParsePath(path), field, val); | ||
46 | } | ||
47 | |||
48 | bool AnalyserEx::ReadFieldOld(const QString& dev, const QString& reg, | ||
49 | const QString& field, soc_word_t& val) | ||
50 | { | ||
51 | return ReadField(dev + "." + reg, field, val); | ||
52 | } | ||
22 | 53 | ||
23 | /** | 54 | /** |
24 | * Clock analyser | 55 | * Clock analyser |
25 | */ | 56 | */ |
26 | 57 | ||
27 | ClockAnalyser::ClockAnalyser(const SocRef& soc, IoBackend *backend) | 58 | ClockAnalyser::ClockAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend) |
28 | :Analyser(soc, backend) | 59 | :AnalyserEx(soc, backend) |
29 | { | 60 | { |
30 | m_group = new QGroupBox("Clock Analyser"); | 61 | m_group = new QGroupBox("Clock Analyser"); |
31 | QVBoxLayout *layout = new QVBoxLayout; | 62 | QVBoxLayout *layout = new QVBoxLayout; |
@@ -75,7 +106,8 @@ QString ClockAnalyser::GetFreq(unsigned freq) | |||
75 | return QString().sprintf("%d Hz", freq); | 106 | return QString().sprintf("%d Hz", freq); |
76 | } | 107 | } |
77 | 108 | ||
78 | QTreeWidgetItem *ClockAnalyser::AddClock(QTreeWidgetItem *parent, const QString& name, int freq, int mul, int div) | 109 | QTreeWidgetItem *ClockAnalyser::AddClock(QTreeWidgetItem *parent, const QString& name, |
110 | int freq, int mul, int div) | ||
79 | { | 111 | { |
80 | if(freq == FROM_PARENT) | 112 | if(freq == FROM_PARENT) |
81 | { | 113 | { |
@@ -102,9 +134,9 @@ int ClockAnalyser::GetClockFreq(QTreeWidgetItem *item) | |||
102 | void ClockAnalyser::FillTree() | 134 | void ClockAnalyser::FillTree() |
103 | { | 135 | { |
104 | m_tree_widget->clear(); | 136 | m_tree_widget->clear(); |
105 | if(m_soc.GetSoc().name == "imx233") FillTreeIMX233(); | 137 | if(m_soc.get()->name == "imx233") FillTreeIMX233(); |
106 | else if(m_soc.GetSoc().name == "rk27xx") FillTreeRK27XX(); | 138 | else if(m_soc.get()->name == "rk27xx") FillTreeRK27XX(); |
107 | else if(m_soc.GetSoc().name == "atj213x") FillTreeATJ213X(); | 139 | else if(m_soc.get()->name == "atj213x") FillTreeATJ213X(); |
108 | m_tree_widget->expandAll(); | 140 | m_tree_widget->expandAll(); |
109 | m_tree_widget->resizeColumnToContents(0); | 141 | m_tree_widget->resizeColumnToContents(0); |
110 | } | 142 | } |
@@ -113,17 +145,15 @@ void ClockAnalyser::FillTreeATJ213X() | |||
113 | { | 145 | { |
114 | soc_word_t pllbypass, pllclk, en, coreclks, tmp0, tmp1, tmp2, tmp3; | 146 | soc_word_t pllbypass, pllclk, en, coreclks, tmp0, tmp1, tmp2, tmp3; |
115 | 147 | ||
116 | BackendHelper helper(m_io_backend, m_soc); | ||
117 | |||
118 | // system oscillators 32.768k and 24M | 148 | // system oscillators 32.768k and 24M |
119 | QTreeWidgetItem *losc_clk = AddClock(0, "losc clk", 32768); | 149 | QTreeWidgetItem *losc_clk = AddClock(0, "losc clk", 32768); |
120 | QTreeWidgetItem *hosc_clk = AddClock(0, "hosc clk", 24000000); | 150 | QTreeWidgetItem *hosc_clk = AddClock(0, "hosc clk", 24000000); |
121 | 151 | ||
122 | // core pll | 152 | // core pll |
123 | QTreeWidgetItem *corepll = 0; | 153 | QTreeWidgetItem *corepll = 0; |
124 | if (helper.ReadRegisterField("CMU", "COREPLL", "CPEN", en) && | 154 | if(ReadFieldOld("CMU", "COREPLL", "CPEN", en) && |
125 | helper.ReadRegisterField("CMU", "COREPLL", "CPBY", pllbypass) && | 155 | ReadFieldOld("CMU", "COREPLL", "CPBY", pllbypass) && |
126 | helper.ReadRegisterField("CMU", "COREPLL", "CPCK", pllclk)) | 156 | ReadFieldOld("CMU", "COREPLL", "CPCK", pllclk)) |
127 | { | 157 | { |
128 | corepll = AddClock(hosc_clk, "core pll", en ? FROM_PARENT : DISABLED, | 158 | corepll = AddClock(hosc_clk, "core pll", en ? FROM_PARENT : DISABLED, |
129 | pllbypass ? 1 : pllclk, pllbypass ? 1 : 4); | 159 | pllbypass ? 1 : pllclk, pllbypass ? 1 : 4); |
@@ -135,8 +165,8 @@ void ClockAnalyser::FillTreeATJ213X() | |||
135 | 165 | ||
136 | // dsp pll | 166 | // dsp pll |
137 | QTreeWidgetItem *dsppll = 0; | 167 | QTreeWidgetItem *dsppll = 0; |
138 | if (helper.ReadRegisterField("CMU", "DSPPLL", "DPEN", en) && | 168 | if(ReadFieldOld("CMU", "DSPPLL", "DPEN", en) && |
139 | helper.ReadRegisterField("CMU", "DSPPLL", "DPCK", pllclk)) | 169 | ReadFieldOld("CMU", "DSPPLL", "DPCK", pllclk)) |
140 | { | 170 | { |
141 | dsppll = AddClock(hosc_clk, "dsp pll", en ? FROM_PARENT : DISABLED, | 171 | dsppll = AddClock(hosc_clk, "dsp pll", en ? FROM_PARENT : DISABLED, |
142 | pllbypass ? 1 : pllclk, pllbypass ? 1 : 4); | 172 | pllbypass ? 1 : pllclk, pllbypass ? 1 : 4); |
@@ -149,11 +179,11 @@ void ClockAnalyser::FillTreeATJ213X() | |||
149 | // audio pll | 179 | // audio pll |
150 | QTreeWidgetItem *adcpll = 0; | 180 | QTreeWidgetItem *adcpll = 0; |
151 | QTreeWidgetItem *dacpll = 0; | 181 | QTreeWidgetItem *dacpll = 0; |
152 | if (helper.ReadRegisterField("CMU", "AUDIOPLL", "APEN", en) && | 182 | if(ReadFieldOld("CMU", "AUDIOPLL", "APEN", en) && |
153 | helper.ReadRegisterField("CMU", "AUDIOPLL", "ADCCLK", tmp0) && | 183 | ReadFieldOld("CMU", "AUDIOPLL", "ADCCLK", tmp0) && |
154 | helper.ReadRegisterField("CMU", "AUDIOPLL", "DACCLK", tmp1)) | 184 | ReadFieldOld("CMU", "AUDIOPLL", "DACCLK", tmp1)) |
155 | { | 185 | { |
156 | if (en) | 186 | if(en) |
157 | { | 187 | { |
158 | adcpll = AddClock(hosc_clk, "audio adc pll", tmp0 ? 22579200 : 24576000); | 188 | adcpll = AddClock(hosc_clk, "audio adc pll", tmp0 ? 22579200 : 24576000); |
159 | dacpll = AddClock(hosc_clk, "audio dac pll", tmp1 ? 22579200 : 24576000); | 189 | dacpll = AddClock(hosc_clk, "audio dac pll", tmp1 ? 22579200 : 24576000); |
@@ -173,8 +203,8 @@ void ClockAnalyser::FillTreeATJ213X() | |||
173 | // audio clocks | 203 | // audio clocks |
174 | QTreeWidgetItem *adcclk = 0; | 204 | QTreeWidgetItem *adcclk = 0; |
175 | QTreeWidgetItem *dacclk = 0; | 205 | QTreeWidgetItem *dacclk = 0; |
176 | if (helper.ReadRegisterField("CMU", "AUDIOPLL", "ADCCLK", tmp0) && | 206 | if(ReadFieldOld("CMU", "AUDIOPLL", "ADCCLK", tmp0) && |
177 | helper.ReadRegisterField("CMU", "AUDIOPLL", "DACCLK", tmp1)) | 207 | ReadFieldOld("CMU", "AUDIOPLL", "DACCLK", tmp1)) |
178 | { | 208 | { |
179 | adcclk = AddClock(adcpll, "audio adc clk", FROM_PARENT, 1, tmp0+1); | 209 | adcclk = AddClock(adcpll, "audio adc clk", FROM_PARENT, 1, tmp0+1); |
180 | dacclk = AddClock(dacpll, "audio dac clk", FROM_PARENT, 1, tmp1+1); | 210 | dacclk = AddClock(dacpll, "audio dac clk", FROM_PARENT, 1, tmp1+1); |
@@ -187,14 +217,14 @@ void ClockAnalyser::FillTreeATJ213X() | |||
187 | 217 | ||
188 | // cpu clock | 218 | // cpu clock |
189 | QTreeWidgetItem *cpuclk = 0; | 219 | QTreeWidgetItem *cpuclk = 0; |
190 | if (helper.ReadRegisterField("CMU", "BUSCLK", "CORECLKS", coreclks) && | 220 | if(ReadFieldOld("CMU", "BUSCLK", "CORECLKS", coreclks) && |
191 | helper.ReadRegisterField("CMU", "BUSCLK", "CCLKDIV", tmp0)) | 221 | ReadFieldOld("CMU", "BUSCLK", "CCLKDIV", tmp0)) |
192 | { | 222 | { |
193 | if (coreclks == 0) | 223 | if(coreclks == 0) |
194 | cpuclk = AddClock(losc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1); | 224 | cpuclk = AddClock(losc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1); |
195 | else if (coreclks == 1) | 225 | else if(coreclks == 1) |
196 | cpuclk = AddClock(hosc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1); | 226 | cpuclk = AddClock(hosc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1); |
197 | else if (coreclks == 2) | 227 | else if(coreclks == 2) |
198 | cpuclk = AddClock(corepll, "cpu clk", FROM_PARENT, 1, tmp0+1); | 228 | cpuclk = AddClock(corepll, "cpu clk", FROM_PARENT, 1, tmp0+1); |
199 | else | 229 | else |
200 | cpuclk = AddClock(corepll, "cpu clk", INVALID); | 230 | cpuclk = AddClock(corepll, "cpu clk", INVALID); |
@@ -206,24 +236,24 @@ void ClockAnalyser::FillTreeATJ213X() | |||
206 | 236 | ||
207 | // system clock | 237 | // system clock |
208 | QTreeWidgetItem *sysclk = 0; | 238 | QTreeWidgetItem *sysclk = 0; |
209 | if (helper.ReadRegisterField("CMU", "BUSCLK", "SCLKDIV", tmp0)) | 239 | if(ReadFieldOld("CMU", "BUSCLK", "SCLKDIV", tmp0)) |
210 | sysclk = AddClock(cpuclk, "system clk", FROM_PARENT, 1, tmp0+1); | 240 | sysclk = AddClock(cpuclk, "system clk", FROM_PARENT, 1, tmp0+1); |
211 | else | 241 | else |
212 | sysclk = AddClock(cpuclk, "system clk", INVALID); | 242 | sysclk = AddClock(cpuclk, "system clk", INVALID); |
213 | 243 | ||
214 | // peripherial clk | 244 | // peripherial clk |
215 | QTreeWidgetItem *pclk = 0; | 245 | QTreeWidgetItem *pclk = 0; |
216 | if (helper.ReadRegisterField("CMU", "BUSCLK", "PCLKDIV", tmp0)) | 246 | if(ReadFieldOld("CMU", "BUSCLK", "PCLKDIV", tmp0)) |
217 | pclk = AddClock(sysclk, "peripherial clk", FROM_PARENT, 1, tmp0 ? tmp0+1 : 2); | 247 | pclk = AddClock(sysclk, "peripherial clk", FROM_PARENT, 1, tmp0 ? tmp0+1 : 2); |
218 | else | 248 | else |
219 | pclk = AddClock(sysclk, "peripherial clk", INVALID); | 249 | pclk = AddClock(sysclk, "peripherial clk", INVALID); |
220 | 250 | ||
221 | // sdram clk | 251 | // sdram clk |
222 | QTreeWidgetItem *sdrclk = 0; | 252 | QTreeWidgetItem *sdrclk = 0; |
223 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "SDRC", en) && | 253 | if(ReadFieldOld("CMU", "DEVCLKEN", "SDRC", en) && |
224 | helper.ReadRegisterField("CMU", "DEVCLKEN", "SDRM", tmp0) && | 254 | ReadFieldOld("CMU", "DEVCLKEN", "SDRM", tmp0) && |
225 | helper.ReadRegisterField("SDR", "EN", "EN", tmp1) && | 255 | ReadFieldOld("SDR", "EN", "EN", tmp1) && |
226 | helper.ReadRegisterField("CMU", "SDRCLK", "SDRDIV", tmp2)) | 256 | ReadFieldOld("CMU", "SDRCLK", "SDRDIV", tmp2)) |
227 | { | 257 | { |
228 | en &= tmp0 & tmp1; | 258 | en &= tmp0 & tmp1; |
229 | sdrclk = AddClock(sysclk, "sdram clk", en ? FROM_PARENT: DISABLED, 1, tmp2+1); | 259 | sdrclk = AddClock(sysclk, "sdram clk", en ? FROM_PARENT: DISABLED, 1, tmp2+1); |
@@ -233,18 +263,18 @@ void ClockAnalyser::FillTreeATJ213X() | |||
233 | 263 | ||
234 | // nand clk | 264 | // nand clk |
235 | QTreeWidgetItem *nandclk = 0; | 265 | QTreeWidgetItem *nandclk = 0; |
236 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "NAND", en) && | 266 | if(ReadFieldOld("CMU", "DEVCLKEN", "NAND", en) && |
237 | helper.ReadRegisterField("CMU", "NANDCLK", "NANDDIV", tmp0)) | 267 | ReadFieldOld("CMU", "NANDCLK", "NANDDIV", tmp0)) |
238 | nandclk = AddClock(corepll, "nand clk", en ? FROM_PARENT : DISABLED, 1, tmp0+1); | 268 | nandclk = AddClock(corepll, "nand clk", en ? FROM_PARENT : DISABLED, 1, tmp0+1); |
239 | else | 269 | else |
240 | nandclk = AddClock(corepll, "nand clk", INVALID); | 270 | nandclk = AddClock(corepll, "nand clk", INVALID); |
241 | 271 | ||
242 | // sd clk | 272 | // sd clk |
243 | QTreeWidgetItem *sdclk = 0; | 273 | QTreeWidgetItem *sdclk = 0; |
244 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "SD", tmp0) && | 274 | if(ReadFieldOld("CMU", "DEVCLKEN", "SD", tmp0) && |
245 | helper.ReadRegisterField("CMU", "SDCLK", "CKEN" , tmp1) && | 275 | ReadFieldOld("CMU", "SDCLK", "CKEN" , tmp1) && |
246 | helper.ReadRegisterField("CMU", "SDCLK", "D128" , tmp2) && | 276 | ReadFieldOld("CMU", "SDCLK", "D128" , tmp2) && |
247 | helper.ReadRegisterField("CMU", "SDCLK", "SDDIV" , tmp3)) | 277 | ReadFieldOld("CMU", "SDCLK", "SDDIV" , tmp3)) |
248 | { | 278 | { |
249 | en = tmp0 & tmp1; | 279 | en = tmp0 & tmp1; |
250 | sdclk = AddClock(corepll, "sd clk", en ? FROM_PARENT : DISABLED, | 280 | sdclk = AddClock(corepll, "sd clk", en ? FROM_PARENT : DISABLED, |
@@ -255,8 +285,8 @@ void ClockAnalyser::FillTreeATJ213X() | |||
255 | 285 | ||
256 | // mha clk | 286 | // mha clk |
257 | QTreeWidgetItem *mhaclk = 0; | 287 | QTreeWidgetItem *mhaclk = 0; |
258 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "MHA", en) && | 288 | if(ReadFieldOld("CMU", "DEVCLKEN", "MHA", en) && |
259 | helper.ReadRegisterField("CMU", "MHACLK", "MHADIV", tmp1)) | 289 | ReadFieldOld("CMU", "MHACLK", "MHADIV", tmp1)) |
260 | mhaclk = AddClock(corepll, "mha clk", en ? FROM_PARENT : DISABLED, | 290 | mhaclk = AddClock(corepll, "mha clk", en ? FROM_PARENT : DISABLED, |
261 | 1, tmp1+1); | 291 | 1, tmp1+1); |
262 | else | 292 | else |
@@ -264,8 +294,8 @@ void ClockAnalyser::FillTreeATJ213X() | |||
264 | 294 | ||
265 | // mca clk | 295 | // mca clk |
266 | QTreeWidgetItem *mcaclk = 0; | 296 | QTreeWidgetItem *mcaclk = 0; |
267 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "MCA", en) && | 297 | if(ReadFieldOld("CMU", "DEVCLKEN", "MCA", en) && |
268 | helper.ReadRegisterField("CMU", "MCACLK", "MCADIV", tmp1)) | 298 | ReadFieldOld("CMU", "MCACLK", "MCADIV", tmp1)) |
269 | mcaclk = AddClock(corepll, "mca clk", en ? FROM_PARENT : DISABLED, | 299 | mcaclk = AddClock(corepll, "mca clk", en ? FROM_PARENT : DISABLED, |
270 | 1, tmp1+1); | 300 | 1, tmp1+1); |
271 | else | 301 | else |
@@ -273,11 +303,11 @@ void ClockAnalyser::FillTreeATJ213X() | |||
273 | 303 | ||
274 | // backlight pwm | 304 | // backlight pwm |
275 | QTreeWidgetItem *pwmclk = 0; | 305 | QTreeWidgetItem *pwmclk = 0; |
276 | if (helper.ReadRegisterField("CMU", "FMCLK", "BCKE", en) && | 306 | if(ReadFieldOld("CMU", "FMCLK", "BCKE", en) && |
277 | helper.ReadRegisterField("CMU", "FMCLK", "BCKS", tmp1) && | 307 | ReadFieldOld("CMU", "FMCLK", "BCKS", tmp1) && |
278 | helper.ReadRegisterField("CMU", "FMCLK", "BCKCON", tmp2)) | 308 | ReadFieldOld("CMU", "FMCLK", "BCKCON", tmp2)) |
279 | { | 309 | { |
280 | if (tmp1) | 310 | if(tmp1) |
281 | { | 311 | { |
282 | // HOSC/8 input clk | 312 | // HOSC/8 input clk |
283 | pwmclk = AddClock(hosc_clk, "pwm clk", en ? FROM_PARENT : DISABLED, | 313 | pwmclk = AddClock(hosc_clk, "pwm clk", en ? FROM_PARENT : DISABLED, |
@@ -296,9 +326,9 @@ void ClockAnalyser::FillTreeATJ213X() | |||
296 | // i2c clk | 326 | // i2c clk |
297 | QTreeWidgetItem *i2c1clk = 0; | 327 | QTreeWidgetItem *i2c1clk = 0; |
298 | QTreeWidgetItem *i2c2clk = 0; | 328 | QTreeWidgetItem *i2c2clk = 0; |
299 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "I2C", en) && | 329 | if(ReadFieldOld("CMU", "DEVCLKEN", "I2C", en) && |
300 | helper.ReadRegisterField("I2C1", "CTL", "EN", tmp0) && | 330 | ReadFieldOld("I2C1", "CTL", "EN", tmp0) && |
301 | helper.ReadRegisterField("I2C1", "CLKDIV", "CLKDIV", tmp1)) | 331 | ReadFieldOld("I2C1", "CLKDIV", "CLKDIV", tmp1)) |
302 | { | 332 | { |
303 | en &= tmp0; | 333 | en &= tmp0; |
304 | i2c1clk = AddClock(pclk, "i2c1 clk", en ? FROM_PARENT : DISABLED, | 334 | i2c1clk = AddClock(pclk, "i2c1 clk", en ? FROM_PARENT : DISABLED, |
@@ -309,16 +339,16 @@ void ClockAnalyser::FillTreeATJ213X() | |||
309 | i2c1clk = AddClock(pclk, "i2c1 clk", INVALID); | 339 | i2c1clk = AddClock(pclk, "i2c1 clk", INVALID); |
310 | } | 340 | } |
311 | 341 | ||
312 | if (helper.ReadRegisterField("CMU", "DEVCLKEN", "I2C", en) && | 342 | if(ReadFieldOld("CMU", "DEVCLKEN", "I2C", en) && |
313 | helper.ReadRegisterField("I2C2", "CTL", "EN", tmp0) && | 343 | ReadFieldOld("I2C2", "CTL", "EN", tmp0) && |
314 | helper.ReadRegisterField("I2C2", "CLKDIV", "CLKDIV", tmp1)) | 344 | ReadFieldOld("I2C2", "CLKDIV", "CLKDIV", tmp1)) |
315 | { | 345 | { |
316 | en &= tmp0; | 346 | en &= tmp0; |
317 | i2c2clk = AddClock(pclk, "i2c2 clk", en ? FROM_PARENT : DISABLED, | 347 | i2c2clk = AddClock(pclk, "i2c2 clk", en ? FROM_PARENT : DISABLED, |
318 | 1, 16*(tmp1+1)); | 348 | 1, 16*(tmp1+1)); |
319 | } | 349 | } |
320 | else | 350 | else |
321 | { | 351 | { |
322 | i2c2clk = AddClock(pclk, "i2c2 clk", INVALID); | 352 | i2c2clk = AddClock(pclk, "i2c2 clk", INVALID); |
323 | } | 353 | } |
324 | 354 | ||
@@ -340,17 +370,15 @@ void ClockAnalyser::FillTreeRK27XX() | |||
340 | soc_word_t value, value2, value3, value4; | 370 | soc_word_t value, value2, value3, value4; |
341 | soc_word_t bypass, clkr, clkf, clkod, pll_off; | 371 | soc_word_t bypass, clkr, clkf, clkod, pll_off; |
342 | 372 | ||
343 | BackendHelper helper(m_io_backend, m_soc); | ||
344 | |||
345 | QTreeWidgetItem *xtal_clk = AddClock(0, "xtal clk", 24000000); | 373 | QTreeWidgetItem *xtal_clk = AddClock(0, "xtal clk", 24000000); |
346 | 374 | ||
347 | // F = (Fref*F)/R/OD = (Fref*F)/R/OD | 375 | // F = (Fref*F)/R/OD = (Fref*F)/R/OD |
348 | QTreeWidgetItem *arm_pll = 0; | 376 | QTreeWidgetItem *arm_pll = 0; |
349 | if (helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_BYPASS", bypass) && | 377 | if(ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_BYPASS", bypass) && |
350 | helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_CLKR", clkr) && | 378 | ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_CLKR", clkr) && |
351 | helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_CLKF", clkf) && | 379 | ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_CLKF", clkf) && |
352 | helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_CLKOD", clkod) && | 380 | ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_CLKOD", clkod) && |
353 | helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_POWERDOWN", pll_off)) | 381 | ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_POWERDOWN", pll_off)) |
354 | { | 382 | { |
355 | arm_pll = AddClock(xtal_clk, "arm pll", pll_off ? DISABLED : FROM_PARENT, | 383 | arm_pll = AddClock(xtal_clk, "arm pll", pll_off ? DISABLED : FROM_PARENT, |
356 | bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); | 384 | bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); |
@@ -363,9 +391,9 @@ void ClockAnalyser::FillTreeRK27XX() | |||
363 | QTreeWidgetItem *arm_clk = 0; | 391 | QTreeWidgetItem *arm_clk = 0; |
364 | QTreeWidgetItem *hclk = 0; | 392 | QTreeWidgetItem *hclk = 0; |
365 | QTreeWidgetItem *pclk = 0; | 393 | QTreeWidgetItem *pclk = 0; |
366 | if(helper.ReadRegisterField("SCU", "DIVCON1", "ARM_SLOW_MODE", value) && | 394 | if(ReadFieldOld("SCU", "DIVCON1", "ARM_SLOW_MODE", value) && |
367 | helper.ReadRegisterField("SCU", "DIVCON1", "ARM_CLK_DIV", value2) && | 395 | ReadFieldOld("SCU", "DIVCON1", "ARM_CLK_DIV", value2) && |
368 | helper.ReadRegisterField("SCU", "DIVCON1", "PCLK_CLK_DIV", value3)) | 396 | ReadFieldOld("SCU", "DIVCON1", "PCLK_CLK_DIV", value3)) |
369 | { | 397 | { |
370 | arm_clk = AddClock(value ? xtal_clk : arm_pll, "arm clk", FROM_PARENT, 1, value2 ? 2 : 1); | 398 | arm_clk = AddClock(value ? xtal_clk : arm_pll, "arm clk", FROM_PARENT, 1, value2 ? 2 : 1); |
371 | hclk = AddClock(arm_clk, "hclk", FROM_PARENT, 1, value2 ? 1 : 2); | 399 | hclk = AddClock(arm_clk, "hclk", FROM_PARENT, 1, value2 ? 1 : 2); |
@@ -379,11 +407,11 @@ void ClockAnalyser::FillTreeRK27XX() | |||
379 | } | 407 | } |
380 | 408 | ||
381 | QTreeWidgetItem *dsp_pll = 0; | 409 | QTreeWidgetItem *dsp_pll = 0; |
382 | if (helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_BYPASS", bypass) && | 410 | if(ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_BYPASS", bypass) && |
383 | helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_CLKR", clkr) && | 411 | ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_CLKR", clkr) && |
384 | helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_CLKF", clkf) && | 412 | ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_CLKF", clkf) && |
385 | helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_CLKOD", clkod) && | 413 | ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_CLKOD", clkod) && |
386 | helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_POWERDOWN", pll_off)) | 414 | ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_POWERDOWN", pll_off)) |
387 | { | 415 | { |
388 | dsp_pll = AddClock(xtal_clk, "dsp pll", pll_off ? DISABLED : FROM_PARENT, | 416 | dsp_pll = AddClock(xtal_clk, "dsp pll", pll_off ? DISABLED : FROM_PARENT, |
389 | bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); | 417 | bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); |
@@ -396,11 +424,11 @@ void ClockAnalyser::FillTreeRK27XX() | |||
396 | QTreeWidgetItem *dsp_clk = AddClock(dsp_pll, "dsp clk", FROM_PARENT); | 424 | QTreeWidgetItem *dsp_clk = AddClock(dsp_pll, "dsp clk", FROM_PARENT); |
397 | 425 | ||
398 | QTreeWidgetItem *codec_pll = 0; | 426 | QTreeWidgetItem *codec_pll = 0; |
399 | if (helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_BYPASS", bypass) && | 427 | if(ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_BYPASS", bypass) && |
400 | helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_CLKR", clkr) && | 428 | ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_CLKR", clkr) && |
401 | helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_CLKF", clkf) && | 429 | ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_CLKF", clkf) && |
402 | helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_CLKOD", clkod) && | 430 | ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_CLKOD", clkod) && |
403 | helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_POWERDOWN", pll_off)) | 431 | ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_POWERDOWN", pll_off)) |
404 | { | 432 | { |
405 | codec_pll = AddClock(xtal_clk, "codec pll", pll_off ? DISABLED : FROM_PARENT, | 433 | codec_pll = AddClock(xtal_clk, "codec pll", pll_off ? DISABLED : FROM_PARENT, |
406 | bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); | 434 | bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); |
@@ -411,8 +439,8 @@ void ClockAnalyser::FillTreeRK27XX() | |||
411 | } | 439 | } |
412 | 440 | ||
413 | QTreeWidgetItem *codec_clk = 0; | 441 | QTreeWidgetItem *codec_clk = 0; |
414 | if (helper.ReadRegisterField("SCU", "DIVCON1", "CODEC_CLK_SRC", value) && | 442 | if(ReadFieldOld("SCU", "DIVCON1", "CODEC_CLK_SRC", value) && |
415 | helper.ReadRegisterField("SCU", "DIVCON1", "CODEC_CLK_DIV", value2)) | 443 | ReadFieldOld("SCU", "DIVCON1", "CODEC_CLK_DIV", value2)) |
416 | { | 444 | { |
417 | codec_clk = AddClock(value ? xtal_clk : codec_pll, "codec clk", FROM_PARENT, 1, value ? 1 : (value2 + 1)); | 445 | codec_clk = AddClock(value ? xtal_clk : codec_pll, "codec clk", FROM_PARENT, 1, value ? 1 : (value2 + 1)); |
418 | } | 446 | } |
@@ -422,7 +450,7 @@ void ClockAnalyser::FillTreeRK27XX() | |||
422 | } | 450 | } |
423 | 451 | ||
424 | QTreeWidgetItem *lsadc_clk = 0; | 452 | QTreeWidgetItem *lsadc_clk = 0; |
425 | if (helper.ReadRegisterField("SCU", "DIVCON1", "LSADC_CLK_DIV", value)) | 453 | if(ReadFieldOld("SCU", "DIVCON1", "LSADC_CLK_DIV", value)) |
426 | { | 454 | { |
427 | lsadc_clk = AddClock(pclk, "lsadc clk", FROM_PARENT, 1, (value+1)); | 455 | lsadc_clk = AddClock(pclk, "lsadc clk", FROM_PARENT, 1, (value+1)); |
428 | } | 456 | } |
@@ -432,11 +460,11 @@ void ClockAnalyser::FillTreeRK27XX() | |||
432 | } | 460 | } |
433 | 461 | ||
434 | QTreeWidgetItem *lcdc_clk = 0; | 462 | QTreeWidgetItem *lcdc_clk = 0; |
435 | if (helper.ReadRegisterField("SCU", "DIVCON1", "LCDC_CLK", value) && | 463 | if(ReadFieldOld("SCU", "DIVCON1", "LCDC_CLK", value) && |
436 | helper.ReadRegisterField("SCU", "DIVCON1", "LCDC_CLK_DIV", value2) && | 464 | ReadFieldOld("SCU", "DIVCON1", "LCDC_CLK_DIV", value2) && |
437 | helper.ReadRegisterField("SCU", "DIVCON1", "LCDC_CLK_DIV_SRC", value3)) | 465 | ReadFieldOld("SCU", "DIVCON1", "LCDC_CLK_DIV_SRC", value3)) |
438 | { | 466 | { |
439 | if (value) | 467 | if(value) |
440 | { | 468 | { |
441 | lcdc_clk = AddClock(xtal_clk, "lcdc clk", FROM_PARENT); | 469 | lcdc_clk = AddClock(xtal_clk, "lcdc clk", FROM_PARENT); |
442 | } | 470 | } |
@@ -456,9 +484,9 @@ void ClockAnalyser::FillTreeRK27XX() | |||
456 | } | 484 | } |
457 | 485 | ||
458 | QTreeWidgetItem *pwm0_clk = 0; | 486 | QTreeWidgetItem *pwm0_clk = 0; |
459 | if(helper.ReadRegisterField("PWM0", "LRC", "TR", value) && | 487 | if(ReadFieldOld("PWM0", "LRC", "TR", value) && |
460 | helper.ReadRegisterField("PWM0", "CTRL", "PRESCALE", value3) && | 488 | ReadFieldOld("PWM0", "CTRL", "PRESCALE", value3) && |
461 | helper.ReadRegisterField("PWM0", "CTRL", "PWM_EN", value4)) | 489 | ReadFieldOld("PWM0", "CTRL", "PWM_EN", value4)) |
462 | { | 490 | { |
463 | pwm0_clk = AddClock(pclk, "pwm0 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); | 491 | pwm0_clk = AddClock(pclk, "pwm0 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); |
464 | } | 492 | } |
@@ -468,9 +496,9 @@ void ClockAnalyser::FillTreeRK27XX() | |||
468 | } | 496 | } |
469 | 497 | ||
470 | QTreeWidgetItem *pwm1_clk = 0; | 498 | QTreeWidgetItem *pwm1_clk = 0; |
471 | if(helper.ReadRegisterField("PWM1", "LRC", "TR", value) && | 499 | if(ReadFieldOld("PWM1", "LRC", "TR", value) && |
472 | helper.ReadRegisterField("PWM1", "CTRL", "PRESCALE", value3) && | 500 | ReadFieldOld("PWM1", "CTRL", "PRESCALE", value3) && |
473 | helper.ReadRegisterField("PWM1", "CTRL", "PWM_EN", value4)) | 501 | ReadFieldOld("PWM1", "CTRL", "PWM_EN", value4)) |
474 | { | 502 | { |
475 | pwm1_clk = AddClock(pclk, "pwm1 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); | 503 | pwm1_clk = AddClock(pclk, "pwm1 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); |
476 | } | 504 | } |
@@ -480,9 +508,9 @@ void ClockAnalyser::FillTreeRK27XX() | |||
480 | } | 508 | } |
481 | 509 | ||
482 | QTreeWidgetItem *pwm2_clk = 0; | 510 | QTreeWidgetItem *pwm2_clk = 0; |
483 | if(helper.ReadRegisterField("PWM2", "LRC", "TR", value) && | 511 | if(ReadFieldOld("PWM2", "LRC", "TR", value) && |
484 | helper.ReadRegisterField("PWM2", "CTRL", "PRESCALE", value3) && | 512 | ReadFieldOld("PWM2", "CTRL", "PRESCALE", value3) && |
485 | helper.ReadRegisterField("PWM2", "CTRL", "PWM_EN", value4)) | 513 | ReadFieldOld("PWM2", "CTRL", "PWM_EN", value4)) |
486 | { | 514 | { |
487 | pwm2_clk = AddClock(pclk, "pwm2 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); | 515 | pwm2_clk = AddClock(pclk, "pwm2 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); |
488 | } | 516 | } |
@@ -492,9 +520,9 @@ void ClockAnalyser::FillTreeRK27XX() | |||
492 | } | 520 | } |
493 | 521 | ||
494 | QTreeWidgetItem *pwm3_clk = 0; | 522 | QTreeWidgetItem *pwm3_clk = 0; |
495 | if(helper.ReadRegisterField("PWM3", "LRC", "TR", value) && | 523 | if(ReadFieldOld("PWM3", "LRC", "TR", value) && |
496 | helper.ReadRegisterField("PWM3", "CTRL", "PRESCALE", value3) && | 524 | ReadFieldOld("PWM3", "CTRL", "PRESCALE", value3) && |
497 | helper.ReadRegisterField("PWM3", "CTRL", "PWM_EN", value4)) | 525 | ReadFieldOld("PWM3", "CTRL", "PWM_EN", value4)) |
498 | { | 526 | { |
499 | pwm3_clk = AddClock(pclk, "pwm3", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); | 527 | pwm3_clk = AddClock(pclk, "pwm3", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); |
500 | } | 528 | } |
@@ -504,7 +532,7 @@ void ClockAnalyser::FillTreeRK27XX() | |||
504 | } | 532 | } |
505 | 533 | ||
506 | QTreeWidgetItem *sdmmc_clk = 0; | 534 | QTreeWidgetItem *sdmmc_clk = 0; |
507 | if(helper.ReadRegisterField("SD", "CTRL", "DIVIDER", value)) | 535 | if(ReadFieldOld("SD", "CTRL", "DIVIDER", value)) |
508 | { | 536 | { |
509 | sdmmc_clk = AddClock(pclk, "sd clk", FROM_PARENT, 1, value+1); | 537 | sdmmc_clk = AddClock(pclk, "sd clk", FROM_PARENT, 1, value+1); |
510 | } | 538 | } |
@@ -526,73 +554,72 @@ void ClockAnalyser::FillTreeRK27XX() | |||
526 | 554 | ||
527 | void ClockAnalyser::FillTreeIMX233() | 555 | void ClockAnalyser::FillTreeIMX233() |
528 | { | 556 | { |
529 | BackendHelper helper(m_io_backend, m_soc); | ||
530 | soc_word_t value, value2, value3; | 557 | soc_word_t value, value2, value3; |
531 | 558 | ||
532 | QTreeWidgetItem *ring_osc = 0; | 559 | QTreeWidgetItem *ring_osc = 0; |
533 | if(helper.ReadRegisterField("POWER", "MINPWR", "ENABLE_OSC", value)) | 560 | if(ReadFieldOld("POWER", "MINPWR", "ENABLE_OSC", value)) |
534 | ring_osc = AddClock(0, "ring_clk24m", value ? 24000000 : DISABLED); | 561 | ring_osc = AddClock(0, "ring_clk24m", value ? 24000000 : DISABLED); |
535 | else | 562 | else |
536 | ring_osc = AddClock(0, "ring_clk24m", INVALID); | 563 | ring_osc = AddClock(0, "ring_clk24m", INVALID); |
537 | QTreeWidgetItem *xtal_osc = 0; | 564 | QTreeWidgetItem *xtal_osc = 0; |
538 | if(helper.ReadRegisterField("POWER", "MINPWR", "PWD_XTAL24", value)) | 565 | if(ReadFieldOld("POWER", "MINPWR", "PWD_XTAL24", value)) |
539 | xtal_osc = AddClock(0, "xtal_clk24m", value ? DISABLED : 24000000); | 566 | xtal_osc = AddClock(0, "xtal_clk24m", value ? DISABLED : 24000000); |
540 | else | 567 | else |
541 | xtal_osc = AddClock(0, "xtal_clk24m", INVALID); | 568 | xtal_osc = AddClock(0, "xtal_clk24m", INVALID); |
542 | QTreeWidgetItem *ref_xtal = 0; | 569 | QTreeWidgetItem *ref_xtal = 0; |
543 | if(helper.ReadRegisterField("POWER", "MINPWR", "SELECT_OSC", value)) | 570 | if(ReadFieldOld("POWER", "MINPWR", "SELECT_OSC", value)) |
544 | ref_xtal = AddClock(value ? ring_osc : xtal_osc, "ref_xtal", FROM_PARENT); | 571 | ref_xtal = AddClock(value ? ring_osc : xtal_osc, "ref_xtal", FROM_PARENT); |
545 | else | 572 | else |
546 | ref_xtal = AddClock(0, "ref_xtal", INVALID); | 573 | ref_xtal = AddClock(0, "ref_xtal", INVALID); |
547 | 574 | ||
548 | QTreeWidgetItem *ref_pll = 0; | 575 | QTreeWidgetItem *ref_pll = 0; |
549 | if(helper.ReadRegisterField("CLKCTRL", "PLLCTRL0", "POWER", value)) | 576 | if(ReadFieldOld("CLKCTRL", "PLLCTRL0", "POWER", value)) |
550 | ref_pll = AddClock(ref_xtal, "ref_pll", FROM_PARENT, 20); | 577 | ref_pll = AddClock(ref_xtal, "ref_pll", FROM_PARENT, 20); |
551 | else | 578 | else |
552 | ref_pll = AddClock(0, "ref_pll", INVALID); | 579 | ref_pll = AddClock(0, "ref_pll", INVALID); |
553 | 580 | ||
554 | QTreeWidgetItem *ref_io = 0; | 581 | QTreeWidgetItem *ref_io = 0; |
555 | if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATEIO", value) && | 582 | if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATEIO", value) && |
556 | helper.ReadRegisterField("CLKCTRL", "FRAC", "IOFRAC", value2)) | 583 | ReadFieldOld("CLKCTRL", "FRAC", "IOFRAC", value2)) |
557 | ref_io = AddClock(ref_pll, "ref_io", value ? DISABLED : FROM_PARENT, 18, value2); | 584 | ref_io = AddClock(ref_pll, "ref_io", value ? DISABLED : FROM_PARENT, 18, value2); |
558 | else | 585 | else |
559 | ref_io = AddClock(ref_pll, "ref_io", INVALID); | 586 | ref_io = AddClock(ref_pll, "ref_io", INVALID); |
560 | 587 | ||
561 | QTreeWidgetItem *ref_pix = 0; | 588 | QTreeWidgetItem *ref_pix = 0; |
562 | if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATEPIX", value) && | 589 | if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATEPIX", value) && |
563 | helper.ReadRegisterField("CLKCTRL", "FRAC", "PIXFRAC", value2)) | 590 | ReadFieldOld("CLKCTRL", "FRAC", "PIXFRAC", value2)) |
564 | ref_pix = AddClock(ref_pll, "ref_pix", value ? DISABLED : FROM_PARENT, 18, value2); | 591 | ref_pix = AddClock(ref_pll, "ref_pix", value ? DISABLED : FROM_PARENT, 18, value2); |
565 | else | 592 | else |
566 | ref_pix = AddClock(ref_pll, "ref_pix", INVALID); | 593 | ref_pix = AddClock(ref_pll, "ref_pix", INVALID); |
567 | 594 | ||
568 | QTreeWidgetItem *ref_emi = 0; | 595 | QTreeWidgetItem *ref_emi = 0; |
569 | if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATEEMI", value) && | 596 | if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATEEMI", value) && |
570 | helper.ReadRegisterField("CLKCTRL", "FRAC", "EMIFRAC", value2)) | 597 | ReadFieldOld("CLKCTRL", "FRAC", "EMIFRAC", value2)) |
571 | ref_emi = AddClock(ref_pll, "ref_emi", value ? DISABLED : FROM_PARENT, 18, value2); | 598 | ref_emi = AddClock(ref_pll, "ref_emi", value ? DISABLED : FROM_PARENT, 18, value2); |
572 | else | 599 | else |
573 | ref_emi = AddClock(ref_pll, "ref_emi", INVALID); | 600 | ref_emi = AddClock(ref_pll, "ref_emi", INVALID); |
574 | 601 | ||
575 | QTreeWidgetItem *ref_cpu = 0; | 602 | QTreeWidgetItem *ref_cpu = 0; |
576 | if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATECPU", value) && | 603 | if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATECPU", value) && |
577 | helper.ReadRegisterField("CLKCTRL", "FRAC", "CPUFRAC", value2)) | 604 | ReadFieldOld("CLKCTRL", "FRAC", "CPUFRAC", value2)) |
578 | ref_cpu = AddClock(ref_pll, "ref_cpu", value ? DISABLED : FROM_PARENT, 18, value2); | 605 | ref_cpu = AddClock(ref_pll, "ref_cpu", value ? DISABLED : FROM_PARENT, 18, value2); |
579 | else | 606 | else |
580 | ref_cpu = AddClock(ref_pll, "ref_cpu", INVALID); | 607 | ref_cpu = AddClock(ref_pll, "ref_cpu", INVALID); |
581 | 608 | ||
582 | QTreeWidgetItem *clk_p = 0; | 609 | QTreeWidgetItem *clk_p = 0; |
583 | if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_CPU", value)) | 610 | if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_CPU", value)) |
584 | { | 611 | { |
585 | if(!value) | 612 | if(!value) |
586 | { | 613 | { |
587 | if(helper.ReadRegisterField("CLKCTRL", "CPU", "DIV_CPU", value2)) | 614 | if(ReadFieldOld("CLKCTRL", "CPU", "DIV_CPU", value2)) |
588 | clk_p = AddClock(ref_cpu, "clk_p", FROM_PARENT, 1, value2); | 615 | clk_p = AddClock(ref_cpu, "clk_p", FROM_PARENT, 1, value2); |
589 | else | 616 | else |
590 | clk_p = AddClock(ref_cpu, "clk_p", INVALID); | 617 | clk_p = AddClock(ref_cpu, "clk_p", INVALID); |
591 | } | 618 | } |
592 | else | 619 | else |
593 | { | 620 | { |
594 | if(helper.ReadRegisterField("CLKCTRL", "CPU", "DIV_XTAL_FRAC_EN", value) && | 621 | if(ReadFieldOld("CLKCTRL", "CPU", "DIV_XTAL_FRAC_EN", value) && |
595 | helper.ReadRegisterField("CLKCTRL", "CPU", "DIV_XTAL", value2)) | 622 | ReadFieldOld("CLKCTRL", "CPU", "DIV_XTAL", value2)) |
596 | clk_p = AddClock(ref_xtal, "clk_p", FROM_PARENT, value ? 1024 : 1, value2); | 623 | clk_p = AddClock(ref_xtal, "clk_p", FROM_PARENT, value ? 1024 : 1, value2); |
597 | else | 624 | else |
598 | clk_p = AddClock(ref_xtal, "clk_p", INVALID); | 625 | clk_p = AddClock(ref_xtal, "clk_p", INVALID); |
@@ -602,101 +629,101 @@ void ClockAnalyser::FillTreeIMX233() | |||
602 | clk_p = AddClock(ref_xtal, "clk_p", INVALID); | 629 | clk_p = AddClock(ref_xtal, "clk_p", INVALID); |
603 | 630 | ||
604 | QTreeWidgetItem *clk_h = 0; | 631 | QTreeWidgetItem *clk_h = 0; |
605 | if(helper.ReadRegisterField("CLKCTRL", "HBUS", "DIV_FRAC_EN", value) && | 632 | if(ReadFieldOld("CLKCTRL", "HBUS", "DIV_FRAC_EN", value) && |
606 | helper.ReadRegisterField("CLKCTRL", "HBUS", "DIV", value2)) | 633 | ReadFieldOld("CLKCTRL", "HBUS", "DIV", value2)) |
607 | clk_h = AddClock(clk_p, "clk_h", FROM_PARENT, value ? 32 : 1, value2); | 634 | clk_h = AddClock(clk_p, "clk_h", FROM_PARENT, value ? 32 : 1, value2); |
608 | else | 635 | else |
609 | clk_h = AddClock(clk_p, "clk_h", INVALID); | 636 | clk_h = AddClock(clk_p, "clk_h", INVALID); |
610 | 637 | ||
611 | QTreeWidgetItem *clk_x = 0; | 638 | QTreeWidgetItem *clk_x = 0; |
612 | if(helper.ReadRegisterField("CLKCTRL", "XBUS", "DIV", value)) | 639 | if(ReadFieldOld("CLKCTRL", "XBUS", "DIV", value)) |
613 | clk_x = AddClock(ref_xtal, "clk_x", FROM_PARENT, 1, value); | 640 | clk_x = AddClock(ref_xtal, "clk_x", FROM_PARENT, 1, value); |
614 | else | 641 | else |
615 | clk_x = AddClock(ref_xtal, "clk_x", INVALID); | 642 | clk_x = AddClock(ref_xtal, "clk_x", INVALID); |
616 | 643 | ||
617 | if(helper.ReadRegisterField("CLKCTRL", "XTAL", "UART_CLK_GATE", value)) | 644 | if(ReadFieldOld("CLKCTRL", "XTAL", "UART_CLK_GATE", value)) |
618 | AddClock(ref_xtal, "clk_uart", value ? DISABLED : FROM_PARENT); | 645 | AddClock(ref_xtal, "clk_uart", value ? DISABLED : FROM_PARENT); |
619 | else | 646 | else |
620 | AddClock(ref_xtal, "clk_uart", INVALID); | 647 | AddClock(ref_xtal, "clk_uart", INVALID); |
621 | 648 | ||
622 | if(helper.ReadRegisterField("CLKCTRL", "XTAL", "FILT_CLK24M_GATE", value)) | 649 | if(ReadFieldOld("CLKCTRL", "XTAL", "FILT_CLK24M_GATE", value)) |
623 | AddClock(ref_xtal, "clk_filt24m", value ? DISABLED : FROM_PARENT); | 650 | AddClock(ref_xtal, "clk_filt24m", value ? DISABLED : FROM_PARENT); |
624 | else | 651 | else |
625 | AddClock(ref_xtal, "clk_filt24m", INVALID); | 652 | AddClock(ref_xtal, "clk_filt24m", INVALID); |
626 | 653 | ||
627 | if(helper.ReadRegisterField("CLKCTRL", "XTAL", "PWM_CLK24M_GATE", value)) | 654 | if(ReadFieldOld("CLKCTRL", "XTAL", "PWM_CLK24M_GATE", value)) |
628 | AddClock(ref_xtal, "clk_pwm24m", value ? DISABLED : FROM_PARENT); | 655 | AddClock(ref_xtal, "clk_pwm24m", value ? DISABLED : FROM_PARENT); |
629 | else | 656 | else |
630 | AddClock(ref_xtal, "clk_pwm24m", INVALID); | 657 | AddClock(ref_xtal, "clk_pwm24m", INVALID); |
631 | 658 | ||
632 | if(helper.ReadRegisterField("CLKCTRL", "XTAL", "DRI_CLK24M_GATE", value)) | 659 | if(ReadFieldOld("CLKCTRL", "XTAL", "DRI_CLK24M_GATE", value)) |
633 | AddClock(ref_xtal, "clk_dri24m", value ? DISABLED : FROM_PARENT); | 660 | AddClock(ref_xtal, "clk_dri24m", value ? DISABLED : FROM_PARENT); |
634 | else | 661 | else |
635 | AddClock(ref_xtal, "clk_dri24m", INVALID); | 662 | AddClock(ref_xtal, "clk_dri24m", INVALID); |
636 | 663 | ||
637 | if(helper.ReadRegisterField("CLKCTRL", "XTAL", "DIGCTRL_CLK1M_GATE", value)) | 664 | if(ReadFieldOld("CLKCTRL", "XTAL", "DIGCTRL_CLK1M_GATE", value)) |
638 | AddClock(ref_xtal, "clk_1m", value ? DISABLED : FROM_PARENT, 1, 24); | 665 | AddClock(ref_xtal, "clk_1m", value ? DISABLED : FROM_PARENT, 1, 24); |
639 | else | 666 | else |
640 | AddClock(ref_xtal, "clk_1m", INVALID); | 667 | AddClock(ref_xtal, "clk_1m", INVALID); |
641 | 668 | ||
642 | QTreeWidgetItem *clk_32k = 0; | 669 | QTreeWidgetItem *clk_32k = 0; |
643 | if(helper.ReadRegisterField("CLKCTRL", "XTAL", "TIMROT_CLK32K_GATE", value)) | 670 | if(ReadFieldOld("CLKCTRL", "XTAL", "TIMROT_CLK32K_GATE", value)) |
644 | clk_32k = AddClock(ref_xtal, "clk_32k", value ? DISABLED : FROM_PARENT, 1, 750); | 671 | clk_32k = AddClock(ref_xtal, "clk_32k", value ? DISABLED : FROM_PARENT, 1, 750); |
645 | else | 672 | else |
646 | clk_32k = AddClock(ref_xtal, "clk_32k", INVALID); | 673 | clk_32k = AddClock(ref_xtal, "clk_32k", INVALID); |
647 | 674 | ||
648 | AddClock(clk_32k, "clk_adc", FROM_PARENT, 1, 16); | 675 | AddClock(clk_32k, "clk_adc", FROM_PARENT, 1, 16); |
649 | 676 | ||
650 | if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_PIX", value) && | 677 | if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_PIX", value) && |
651 | helper.ReadRegisterField("CLKCTRL", "PIX", "DIV", value2)) | 678 | ReadFieldOld("CLKCTRL", "PIX", "DIV", value2)) |
652 | AddClock(value ? ref_xtal : ref_pix, "clk_pix", FROM_PARENT, 1, value2); | 679 | AddClock(value ? ref_xtal : ref_pix, "clk_pix", FROM_PARENT, 1, value2); |
653 | else | 680 | else |
654 | AddClock(ref_xtal, "clk_p", INVALID); | 681 | AddClock(ref_xtal, "clk_p", INVALID); |
655 | 682 | ||
656 | QTreeWidgetItem *clk_ssp = 0; | 683 | QTreeWidgetItem *clk_ssp = 0; |
657 | if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_SSP", value) && | 684 | if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_SSP", value) && |
658 | helper.ReadRegisterField("CLKCTRL", "SSP", "DIV", value2) && | 685 | ReadFieldOld("CLKCTRL", "SSP", "DIV", value2) && |
659 | helper.ReadRegisterField("CLKCTRL", "SSP", "CLKGATE", value3)) | 686 | ReadFieldOld("CLKCTRL", "SSP", "CLKGATE", value3)) |
660 | clk_ssp = AddClock(value ? ref_xtal : ref_io, "clk_ssp", value3 ? DISABLED : FROM_PARENT, 1, value2); | 687 | clk_ssp = AddClock(value ? ref_xtal : ref_io, "clk_ssp", value3 ? DISABLED : FROM_PARENT, 1, value2); |
661 | else | 688 | else |
662 | clk_ssp = AddClock(ref_xtal, "clk_p", INVALID); | 689 | clk_ssp = AddClock(ref_xtal, "clk_p", INVALID); |
663 | 690 | ||
664 | if(helper.ReadRegisterField("SSP1", "TIMING", "CLOCK_DIVIDE", value) && | 691 | if(ReadFieldOld("SSP1", "TIMING", "CLOCK_DIVIDE", value) && |
665 | helper.ReadRegisterField("SSP1", "TIMING", "CLOCK_RATE", value2) && | 692 | ReadFieldOld("SSP1", "TIMING", "CLOCK_RATE", value2) && |
666 | helper.ReadRegisterField("SSP1", "CTRL0", "CLKGATE", value3)) | 693 | ReadFieldOld("SSP1", "CTRL0", "CLKGATE", value3)) |
667 | AddClock(clk_ssp, "clk_ssp1", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2)); | 694 | AddClock(clk_ssp, "clk_ssp1", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2)); |
668 | else | 695 | else |
669 | AddClock(clk_ssp, "clk_ssp1", INVALID); | 696 | AddClock(clk_ssp, "clk_ssp1", INVALID); |
670 | 697 | ||
671 | if(helper.ReadRegisterField("SSP2", "TIMING", "CLOCK_DIVIDE", value) && | 698 | if(ReadFieldOld("SSP2", "TIMING", "CLOCK_DIVIDE", value) && |
672 | helper.ReadRegisterField("SSP2", "TIMING", "CLOCK_RATE", value2) && | 699 | ReadFieldOld("SSP2", "TIMING", "CLOCK_RATE", value2) && |
673 | helper.ReadRegisterField("SSP2", "CTRL0", "CLKGATE", value3)) | 700 | ReadFieldOld("SSP2", "CTRL0", "CLKGATE", value3)) |
674 | AddClock(clk_ssp, "clk_ssp2", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2)); | 701 | AddClock(clk_ssp, "clk_ssp2", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2)); |
675 | else | 702 | else |
676 | AddClock(clk_ssp, "clk_ssp2", INVALID); | 703 | AddClock(clk_ssp, "clk_ssp2", INVALID); |
677 | 704 | ||
678 | QTreeWidgetItem *clk_gpmi = 0; | 705 | QTreeWidgetItem *clk_gpmi = 0; |
679 | if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_GPMI", value) && | 706 | if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_GPMI", value) && |
680 | helper.ReadRegisterField("CLKCTRL", "GPMI", "DIV", value2) && | 707 | ReadFieldOld("CLKCTRL", "GPMI", "DIV", value2) && |
681 | helper.ReadRegisterField("CLKCTRL", "GPMI", "CLKGATE", value3)) | 708 | ReadFieldOld("CLKCTRL", "GPMI", "CLKGATE", value3)) |
682 | clk_gpmi = AddClock(value ? ref_xtal : ref_io, "clk_gpmi", value3 ? DISABLED : FROM_PARENT, 1, value2); | 709 | clk_gpmi = AddClock(value ? ref_xtal : ref_io, "clk_gpmi", value3 ? DISABLED : FROM_PARENT, 1, value2); |
683 | else | 710 | else |
684 | clk_gpmi = AddClock(ref_xtal, "clk_p", INVALID); | 711 | clk_gpmi = AddClock(ref_xtal, "clk_p", INVALID); |
685 | 712 | ||
686 | if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value)) | 713 | if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value)) |
687 | { | 714 | { |
688 | if(!value) | 715 | if(!value) |
689 | { | 716 | { |
690 | if(helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_EMI", value2) && | 717 | if(ReadFieldOld("CLKCTRL", "EMI", "DIV_EMI", value2) && |
691 | helper.ReadRegisterField("CLKCTRL", "EMI", "CLKGATE", value3)) | 718 | ReadFieldOld("CLKCTRL", "EMI", "CLKGATE", value3)) |
692 | AddClock(ref_emi, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2); | 719 | AddClock(ref_emi, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2); |
693 | else | 720 | else |
694 | AddClock(ref_emi, "clk_emi", INVALID); | 721 | AddClock(ref_emi, "clk_emi", INVALID); |
695 | } | 722 | } |
696 | else | 723 | else |
697 | { | 724 | { |
698 | if(helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_XTAL", value2) && | 725 | if(ReadFieldOld("CLKCTRL", "EMI", "DIV_XTAL", value2) && |
699 | helper.ReadRegisterField("CLKCTRL", "EMI", "CLKGATE", value3)) | 726 | ReadFieldOld("CLKCTRL", "EMI", "CLKGATE", value3)) |
700 | AddClock(ref_xtal, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2); | 727 | AddClock(ref_xtal, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2); |
701 | else | 728 | else |
702 | AddClock(ref_xtal, "clk_emi", INVALID); | 729 | AddClock(ref_xtal, "clk_emi", INVALID); |
@@ -707,27 +734,27 @@ void ClockAnalyser::FillTreeIMX233() | |||
707 | 734 | ||
708 | QTreeWidgetItem *ref_vid = AddClock(ref_pll, "clk_vid", FROM_PARENT); | 735 | QTreeWidgetItem *ref_vid = AddClock(ref_pll, "clk_vid", FROM_PARENT); |
709 | 736 | ||
710 | if(helper.ReadRegisterField("CLKCTRL", "TV", "CLK_TV108M_GATE", value) && | 737 | if(ReadFieldOld("CLKCTRL", "TV", "CLK_TV108M_GATE", value) && |
711 | helper.ReadRegisterField("CLKCTRL", "TV", "CLK_TV_GATE", value2)) | 738 | ReadFieldOld("CLKCTRL", "TV", "CLK_TV_GATE", value2)) |
712 | { | 739 | { |
713 | QTreeWidgetItem *clk_tv108m = AddClock(ref_vid, "clk_tv108m", value ? DISABLED : FROM_PARENT, 1, 4); | 740 | QTreeWidgetItem *clk_tv108m = AddClock(ref_vid, "clk_tv108m", value ? DISABLED : FROM_PARENT, 1, 4); |
714 | AddClock(clk_tv108m, "clk_tv54m", value2 ? DISABLED : FROM_PARENT, 1, 2); | 741 | AddClock(clk_tv108m, "clk_tv54m", value2 ? DISABLED : FROM_PARENT, 1, 2); |
715 | AddClock(clk_tv108m, "clk_tv27m", value2 ? DISABLED : FROM_PARENT, 1, 4); | 742 | AddClock(clk_tv108m, "clk_tv27m", value2 ? DISABLED : FROM_PARENT, 1, 4); |
716 | } | 743 | } |
717 | 744 | ||
718 | if(helper.ReadRegisterField("CLKCTRL", "PLLCTRL0", "EN_USB_CLKS", value)) | 745 | if(ReadFieldOld("CLKCTRL", "PLLCTRL0", "EN_USB_CLKS", value)) |
719 | AddClock(ref_pll, "utmi_clk480m", value ? FROM_PARENT : DISABLED); | 746 | AddClock(ref_pll, "utmi_clk480m", value ? FROM_PARENT : DISABLED); |
720 | else | 747 | else |
721 | AddClock(ref_pll, "utmi_clk480m", INVALID); | 748 | AddClock(ref_pll, "utmi_clk480m", INVALID); |
722 | 749 | ||
723 | QTreeWidgetItem *xtal_clk32k = 0; | 750 | QTreeWidgetItem *xtal_clk32k = 0; |
724 | if(helper.ReadRegisterField("RTC", "PERSISTENT0", "XTAL32_FREQ", value) && | 751 | if(ReadFieldOld("RTC", "PERSISTENT0", "XTAL32_FREQ", value) && |
725 | helper.ReadRegisterField("RTC", "PERSISTENT0", "XTAL32KHZ_PWRUP", value2)) | 752 | ReadFieldOld("RTC", "PERSISTENT0", "XTAL32KHZ_PWRUP", value2)) |
726 | xtal_clk32k = AddClock(0, "xtal_clk32k", value2 == 0 ? DISABLED : value ? 32000 : 32768); | 753 | xtal_clk32k = AddClock(0, "xtal_clk32k", value2 == 0 ? DISABLED : value ? 32000 : 32768); |
727 | else | 754 | else |
728 | xtal_clk32k = AddClock(0, "xtal_clk32k", INVALID); | 755 | xtal_clk32k = AddClock(0, "xtal_clk32k", INVALID); |
729 | 756 | ||
730 | if(helper.ReadRegisterField("RTC", "PERSISTENT0", "CLOCKSOURCE", value)) | 757 | if(ReadFieldOld("RTC", "PERSISTENT0", "CLOCKSOURCE", value)) |
731 | AddClock(value ? xtal_clk32k : ref_xtal, "clk_rtc32k", FROM_PARENT, 1, value ? 1 : 768); | 758 | AddClock(value ? xtal_clk32k : ref_xtal, "clk_rtc32k", FROM_PARENT, 1, value ? 1 : 768); |
732 | else | 759 | else |
733 | AddClock(ref_xtal, "clk_rtc32k", INVALID); | 760 | AddClock(ref_xtal, "clk_rtc32k", INVALID); |
@@ -742,8 +769,8 @@ static TmplAnalyserFactory< ClockAnalyser > g_clock_factory(true, "Clock Analyse | |||
742 | /** | 769 | /** |
743 | * EMI analyser | 770 | * EMI analyser |
744 | */ | 771 | */ |
745 | EmiAnalyser::EmiAnalyser(const SocRef& soc, IoBackend *backend) | 772 | EmiAnalyser::EmiAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend) |
746 | :Analyser(soc, backend) | 773 | :AnalyserEx(soc, backend) |
747 | { | 774 | { |
748 | m_display_mode = DisplayCycles; | 775 | m_display_mode = DisplayCycles; |
749 | m_group = new QGroupBox("EMI Analyser"); | 776 | m_group = new QGroupBox("EMI Analyser"); |
@@ -870,26 +897,25 @@ void EmiAnalyser::FillTable() | |||
870 | { | 897 | { |
871 | while(m_panel->count() > 0) | 898 | while(m_panel->count() > 0) |
872 | m_panel->removeItem(0); | 899 | m_panel->removeItem(0); |
873 | BackendHelper helper(m_io_backend, m_soc); | ||
874 | soc_word_t value; | 900 | soc_word_t value; |
875 | 901 | ||
876 | m_emi_freq = 0; | 902 | m_emi_freq = 0; |
877 | if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value)) | 903 | if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value)) |
878 | { | 904 | { |
879 | bool ret; | 905 | bool ret; |
880 | if(value) | 906 | if(value) |
881 | { | 907 | { |
882 | m_emi_freq = 24000000; | 908 | m_emi_freq = 24000000; |
883 | ret = helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_XTAL", value); | 909 | ret = ReadFieldOld("CLKCTRL", "EMI", "DIV_XTAL", value); |
884 | } | 910 | } |
885 | else | 911 | else |
886 | { | 912 | { |
887 | m_emi_freq = 480000000; | 913 | m_emi_freq = 480000000; |
888 | if(helper.ReadRegisterField("CLKCTRL", "FRAC", "EMIFRAC", value)) | 914 | if(ReadFieldOld("CLKCTRL", "FRAC", "EMIFRAC", value)) |
889 | m_emi_freq = 18 * (int64_t)m_emi_freq / value; | 915 | m_emi_freq = 18 * (int64_t)m_emi_freq / value; |
890 | else | 916 | else |
891 | m_emi_freq = 0; | 917 | m_emi_freq = 0; |
892 | ret = helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_EMI", value); | 918 | ret = ReadFieldOld("CLKCTRL", "EMI", "DIV_EMI", value); |
893 | } | 919 | } |
894 | if(ret) | 920 | if(ret) |
895 | m_emi_freq /= value; | 921 | m_emi_freq /= value; |
@@ -900,7 +926,7 @@ void EmiAnalyser::FillTable() | |||
900 | m_emi_freq_label->setText(QString().sprintf("%.3f", m_emi_freq / 1000000.0)); | 926 | m_emi_freq_label->setText(QString().sprintf("%.3f", m_emi_freq / 1000000.0)); |
901 | 927 | ||
902 | NewGroup("Control Parameters"); | 928 | NewGroup("Control Parameters"); |
903 | if(helper.ReadRegisterField("EMI", "CTRL", "PORT_PRIORITY_ORDER", value)) | 929 | if(ReadFieldOld("EMI", "CTRL", "PORT_PRIORITY_ORDER", value)) |
904 | { | 930 | { |
905 | QStringList ports; | 931 | QStringList ports; |
906 | ports << "AXI0" << "AHB1" << "AHB2" << "AHB3"; | 932 | ports << "AXI0" << "AHB1" << "AHB2" << "AHB3"; |
@@ -913,38 +939,38 @@ void EmiAnalyser::FillTable() | |||
913 | AddLine("Port Priority Order", value, "", order); | 939 | AddLine("Port Priority Order", value, "", order); |
914 | } | 940 | } |
915 | 941 | ||
916 | if(helper.ReadRegisterField("EMI", "CTRL", "MEM_WIDTH", value)) | 942 | if(ReadFieldOld("EMI", "CTRL", "MEM_WIDTH", value)) |
917 | AddLine("Memory Width", value ? 16 : 8, "-bit"); | 943 | AddLine("Memory Width", value ? 16 : 8, "-bit"); |
918 | 944 | ||
919 | if(helper.ReadRegisterField("DRAM", "CTL03", "AP", value)) | 945 | if(ReadFieldOld("DRAM", "CTL03", "AP", value)) |
920 | AddLine("Auto Pre-Charge", NONE, value ? "Yes" : "No"); | 946 | AddLine("Auto Pre-Charge", NONE, value ? "Yes" : "No"); |
921 | 947 | ||
922 | bool bypass_mode = false; | 948 | bool bypass_mode = false; |
923 | if(helper.ReadRegisterField("DRAM", "CTL04", "DLL_BYPASS_MODE", value)) | 949 | if(ReadFieldOld("DRAM", "CTL04", "DLL_BYPASS_MODE", value)) |
924 | { | 950 | { |
925 | bypass_mode = value == 1; | 951 | bypass_mode = value == 1; |
926 | AddLine("DLL Bypass Mode", NONE, value ? "Yes" : "No"); | 952 | AddLine("DLL Bypass Mode", NONE, value ? "Yes" : "No"); |
927 | } | 953 | } |
928 | 954 | ||
929 | if(helper.ReadRegisterField("DRAM", "CTL05", "EN_LOWPOWER_MODE", value)) | 955 | if(ReadFieldOld("DRAM", "CTL05", "EN_LOWPOWER_MODE", value)) |
930 | AddLine("Low Power Mode", NONE, value ? "Enabled" : "Disabled"); | 956 | AddLine("Low Power Mode", NONE, value ? "Enabled" : "Disabled"); |
931 | 957 | ||
932 | if(helper.ReadRegisterField("DRAM", "CTL08", "SREFRESH", value)) | 958 | if(ReadFieldOld("DRAM", "CTL08", "SREFRESH", value)) |
933 | AddLine("Self Refresh", NONE, value ? "Yes" : "No"); | 959 | AddLine("Self Refresh", NONE, value ? "Yes" : "No"); |
934 | 960 | ||
935 | if(helper.ReadRegisterField("DRAM", "CTL08", "SDR_MODE", value)) | 961 | if(ReadFieldOld("DRAM", "CTL08", "SDR_MODE", value)) |
936 | AddLine("Mode", NONE, value ? "SDR" : "DDR"); | 962 | AddLine("Mode", NONE, value ? "SDR" : "DDR"); |
937 | 963 | ||
938 | if(helper.ReadRegisterField("DRAM", "CTL10", "ADDR_PINS", value)) | 964 | if(ReadFieldOld("DRAM", "CTL10", "ADDR_PINS", value)) |
939 | AddLine("Address Pins", 13 - value, ""); | 965 | AddLine("Address Pins", 13 - value, ""); |
940 | 966 | ||
941 | if(helper.ReadRegisterField("DRAM", "CTL11", "COLUMN_SIZE", value)) | 967 | if(ReadFieldOld("DRAM", "CTL11", "COLUMN_SIZE", value)) |
942 | AddLine("Column Size", 12 - value, "-bit"); | 968 | AddLine("Column Size", 12 - value, "-bit"); |
943 | 969 | ||
944 | if(helper.ReadRegisterField("DRAM", "CTL11", "CASLAT", value)) | 970 | if(ReadFieldOld("DRAM", "CTL11", "CASLAT", value)) |
945 | AddLine("Encoded CAS", value, "", "Memory device dependent"); | 971 | AddLine("Encoded CAS", value, "", "Memory device dependent"); |
946 | 972 | ||
947 | if(helper.ReadRegisterField("DRAM", "CTL14", "CS_MAP", value)) | 973 | if(ReadFieldOld("DRAM", "CTL14", "CS_MAP", value)) |
948 | { | 974 | { |
949 | QString v; | 975 | QString v; |
950 | for(int i = 0; i < 4; i++) | 976 | for(int i = 0; i < 4; i++) |
@@ -957,12 +983,12 @@ void EmiAnalyser::FillTable() | |||
957 | AddLine("Chip Select Pins", NONE, v, ""); | 983 | AddLine("Chip Select Pins", NONE, v, ""); |
958 | } | 984 | } |
959 | 985 | ||
960 | if(helper.ReadRegisterField("DRAM", "CTL37", "TREF_ENABLE", value)) | 986 | if(ReadFieldOld("DRAM", "CTL37", "TREF_ENABLE", value)) |
961 | AddLine("Refresh Commands", NONE, value ? "Enabled" : "Disabled", "Issue self-refresh every TREF cycles"); | 987 | AddLine("Refresh Commands", NONE, value ? "Enabled" : "Disabled", "Issue self-refresh every TREF cycles"); |
962 | 988 | ||
963 | NewGroup("Frequency Parameters"); | 989 | NewGroup("Frequency Parameters"); |
964 | 990 | ||
965 | if(helper.ReadRegisterField("DRAM", "CTL13", "CASLAT_LIN_GATE", value)) | 991 | if(ReadFieldOld("DRAM", "CTL13", "CASLAT_LIN_GATE", value)) |
966 | { | 992 | { |
967 | if(value >= 3 && value <= 10 && value != 9) | 993 | if(value >= 3 && value <= 10 && value != 9) |
968 | { | 994 | { |
@@ -972,7 +998,7 @@ void EmiAnalyser::FillTable() | |||
972 | else | 998 | else |
973 | AddLine("CAS Gate", NONE, "Reserved", "Reserved value"); | 999 | AddLine("CAS Gate", NONE, "Reserved", "Reserved value"); |
974 | } | 1000 | } |
975 | if(helper.ReadRegisterField("DRAM", "CTL13", "CASLAT_LIN", value)) | 1001 | if(ReadFieldOld("DRAM", "CTL13", "CASLAT_LIN", value)) |
976 | { | 1002 | { |
977 | if(value >= 3 && value <= 10 && value != 9) | 1003 | if(value >= 3 && value <= 10 && value != 9) |
978 | { | 1004 | { |
@@ -983,97 +1009,97 @@ void EmiAnalyser::FillTable() | |||
983 | AddLine("CAS Latency", NONE, "Reserved", "Reserved value"); | 1009 | AddLine("CAS Latency", NONE, "Reserved", "Reserved value"); |
984 | } | 1010 | } |
985 | 1011 | ||
986 | if(helper.ReadRegisterField("DRAM", "CTL12", "TCKE", value)) | 1012 | if(ReadFieldOld("DRAM", "CTL12", "TCKE", value)) |
987 | AddCycleLine("tCKE", value, value, 0, "Minimum CKE pulse width"); | 1013 | AddCycleLine("tCKE", value, value, 0, "Minimum CKE pulse width"); |
988 | 1014 | ||
989 | if(helper.ReadRegisterField("DRAM", "CTL15", "TDAL", value)) | 1015 | if(ReadFieldOld("DRAM", "CTL15", "TDAL", value)) |
990 | AddCycleLine("tDAL", value, value, 0, "Auto pre-charge write recovery time"); | 1016 | AddCycleLine("tDAL", value, value, 0, "Auto pre-charge write recovery time"); |
991 | 1017 | ||
992 | if(helper.ReadRegisterField("DRAM", "CTL31", "TDLL", value)) | 1018 | if(ReadFieldOld("DRAM", "CTL31", "TDLL", value)) |
993 | AddCycleLine("tDLL", value, value, 0, "DLL lock time"); | 1019 | AddCycleLine("tDLL", value, value, 0, "DLL lock time"); |
994 | 1020 | ||
995 | if(helper.ReadRegisterField("DRAM", "CTL10", "TEMRS", value)) | 1021 | if(ReadFieldOld("DRAM", "CTL10", "TEMRS", value)) |
996 | AddCycleLine("tEMRS", value, value, 0, "Extended mode parameter set time"); | 1022 | AddCycleLine("tEMRS", value, value, 0, "Extended mode parameter set time"); |
997 | 1023 | ||
998 | if(helper.ReadRegisterField("DRAM", "CTL34", "TINIT", value)) | 1024 | if(ReadFieldOld("DRAM", "CTL34", "TINIT", value)) |
999 | AddCycleLine("tINIT", value, value, 0, "Initialisation time"); | 1025 | AddCycleLine("tINIT", value, value, 0, "Initialisation time"); |
1000 | 1026 | ||
1001 | if(helper.ReadRegisterField("DRAM", "CTL16", "TMRD", value)) | 1027 | if(ReadFieldOld("DRAM", "CTL16", "TMRD", value)) |
1002 | AddCycleLine("tMRD", value, value, 0, "Mode register set command time"); | 1028 | AddCycleLine("tMRD", value, value, 0, "Mode register set command time"); |
1003 | 1029 | ||
1004 | if(helper.ReadRegisterField("DRAM", "CTL40", "TPDEX", value)) | 1030 | if(ReadFieldOld("DRAM", "CTL40", "TPDEX", value)) |
1005 | AddCycleLine("tPDEX", value, value, 0, "Power down exit time"); | 1031 | AddCycleLine("tPDEX", value, value, 0, "Power down exit time"); |
1006 | 1032 | ||
1007 | if(helper.ReadRegisterField("DRAM", "CTL32", "TRAS_MAX", value)) | 1033 | if(ReadFieldOld("DRAM", "CTL32", "TRAS_MAX", value)) |
1008 | AddCycleLine("tRAS Max", value, value, 0, "Maximum row activate time"); | 1034 | AddCycleLine("tRAS Max", value, value, 0, "Maximum row activate time"); |
1009 | 1035 | ||
1010 | if(helper.ReadRegisterField("DRAM", "CTL20", "TRAS_MIN", value)) | 1036 | if(ReadFieldOld("DRAM", "CTL20", "TRAS_MIN", value)) |
1011 | AddCycleLine("tRAS Min", value, value, 0, "Minimum row activate time"); | 1037 | AddCycleLine("tRAS Min", value, value, 0, "Minimum row activate time"); |
1012 | 1038 | ||
1013 | if(helper.ReadRegisterField("DRAM", "CTL17", "TRC", value)) | 1039 | if(ReadFieldOld("DRAM", "CTL17", "TRC", value)) |
1014 | AddCycleLine("tRC", value, value, 0, "Activate to activate delay (same bank)"); | 1040 | AddCycleLine("tRC", value, value, 0, "Activate to activate delay (same bank)"); |
1015 | 1041 | ||
1016 | if(helper.ReadRegisterField("DRAM", "CTL20", "TRCD_INT", value)) | 1042 | if(ReadFieldOld("DRAM", "CTL20", "TRCD_INT", value)) |
1017 | AddCycleLine("tRCD", value, value, 0, "RAS to CAS"); | 1043 | AddCycleLine("tRCD", value, value, 0, "RAS to CAS"); |
1018 | 1044 | ||
1019 | if(helper.ReadRegisterField("DRAM", "CTL26", "TREF", value)) | 1045 | if(ReadFieldOld("DRAM", "CTL26", "TREF", value)) |
1020 | AddCycleLine("tREF", value, value, 0, "Refresh to refresh time"); | 1046 | AddCycleLine("tREF", value, value, 0, "Refresh to refresh time"); |
1021 | 1047 | ||
1022 | if(helper.ReadRegisterField("DRAM", "CTL21", "TRFC", value)) | 1048 | if(ReadFieldOld("DRAM", "CTL21", "TRFC", value)) |
1023 | AddCycleLine("tRFC", value, value, 0, "Refresh command time"); | 1049 | AddCycleLine("tRFC", value, value, 0, "Refresh command time"); |
1024 | 1050 | ||
1025 | if(helper.ReadRegisterField("DRAM", "CTL15", "TRP", value)) | 1051 | if(ReadFieldOld("DRAM", "CTL15", "TRP", value)) |
1026 | AddCycleLine("tRP", value, value, 0, "Pre-charge command time"); | 1052 | AddCycleLine("tRP", value, value, 0, "Pre-charge command time"); |
1027 | 1053 | ||
1028 | if(helper.ReadRegisterField("DRAM", "CTL12", "TRRD", value)) | 1054 | if(ReadFieldOld("DRAM", "CTL12", "TRRD", value)) |
1029 | AddCycleLine("tRRD", value, value, 0, "Activate to activate delay (different banks)"); | 1055 | AddCycleLine("tRRD", value, value, 0, "Activate to activate delay (different banks)"); |
1030 | 1056 | ||
1031 | if(helper.ReadRegisterField("DRAM", "CTL12", "TWR_INT", value)) | 1057 | if(ReadFieldOld("DRAM", "CTL12", "TWR_INT", value)) |
1032 | AddCycleLine("tWR", value, value, 0, "Write recovery time"); | 1058 | AddCycleLine("tWR", value, value, 0, "Write recovery time"); |
1033 | 1059 | ||
1034 | if(helper.ReadRegisterField("DRAM", "CTL13", "TWTR", value)) | 1060 | if(ReadFieldOld("DRAM", "CTL13", "TWTR", value)) |
1035 | AddCycleLine("tWTR", value, value, 0, "Write to read delay"); | 1061 | AddCycleLine("tWTR", value, value, 0, "Write to read delay"); |
1036 | 1062 | ||
1037 | if(helper.ReadRegisterField("DRAM", "CTL32", "TXSNR", value)) | 1063 | if(ReadFieldOld("DRAM", "CTL32", "TXSNR", value)) |
1038 | AddCycleLine("tXSNR", value, value, 0, ""); | 1064 | AddCycleLine("tXSNR", value, value, 0, ""); |
1039 | 1065 | ||
1040 | if(helper.ReadRegisterField("DRAM", "CTL33", "TXSR", value)) | 1066 | if(ReadFieldOld("DRAM", "CTL33", "TXSR", value)) |
1041 | AddCycleLine("tXSR", value, value, 0, "Self-refresh exit time"); | 1067 | AddCycleLine("tXSR", value, value, 0, "Self-refresh exit time"); |
1042 | 1068 | ||
1043 | NewGroup("DLL Parameters"); | 1069 | NewGroup("DLL Parameters"); |
1044 | 1070 | ||
1045 | if(bypass_mode) | 1071 | if(bypass_mode) |
1046 | { | 1072 | { |
1047 | if(helper.ReadRegisterField("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value)) | 1073 | if(ReadFieldOld("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value)) |
1048 | AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle (bypass mode)"); | 1074 | AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle (bypass mode)"); |
1049 | 1075 | ||
1050 | if(helper.ReadRegisterField("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value)) | 1076 | if(ReadFieldOld("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value)) |
1051 | AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle (bypass mode)"); | 1077 | AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle (bypass mode)"); |
1052 | 1078 | ||
1053 | if(helper.ReadRegisterField("DRAM", "CTL19", "DQS_OUT_SHIFT_BYPASS", value)) | 1079 | if(ReadFieldOld("DRAM", "CTL19", "DQS_OUT_SHIFT_BYPASS", value)) |
1054 | AddLine("DQS Out Delay", value, "", "(bypass mode)"); | 1080 | AddLine("DQS Out Delay", value, "", "(bypass mode)"); |
1055 | 1081 | ||
1056 | if(helper.ReadRegisterField("DRAM", "CTL20", "WR_DQS_SHIFT_BYPASS", value)) | 1082 | if(ReadFieldOld("DRAM", "CTL20", "WR_DQS_SHIFT_BYPASS", value)) |
1057 | AddLine("DQS Write Delay", value, "", "(bypass mode)"); | 1083 | AddLine("DQS Write Delay", value, "", "(bypass mode)"); |
1058 | } | 1084 | } |
1059 | else | 1085 | else |
1060 | { | 1086 | { |
1061 | if(helper.ReadRegisterField("DRAM", "CTL17", "DLL_START_POINT", value)) | 1087 | if(ReadFieldOld("DRAM", "CTL17", "DLL_START_POINT", value)) |
1062 | AddLine("DLL Start Point", value, "", "Initial delay count"); | 1088 | AddLine("DLL Start Point", value, "", "Initial delay count"); |
1063 | 1089 | ||
1064 | if(helper.ReadRegisterField("DRAM", "CTL17", "DLL_INCREMENT", value)) | 1090 | if(ReadFieldOld("DRAM", "CTL17", "DLL_INCREMENT", value)) |
1065 | AddLine("DLL Increment", value, "", "Delay increment"); | 1091 | AddLine("DLL Increment", value, "", "Delay increment"); |
1066 | 1092 | ||
1067 | if(helper.ReadRegisterField("DRAM", "CTL18", "DLL_DQS_DELAY_0", value)) | 1093 | if(ReadFieldOld("DRAM", "CTL18", "DLL_DQS_DELAY_0", value)) |
1068 | AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle"); | 1094 | AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle"); |
1069 | 1095 | ||
1070 | if(helper.ReadRegisterField("DRAM", "CTL18", "DLL_DQS_DELAY_1", value)) | 1096 | if(ReadFieldOld("DRAM", "CTL18", "DLL_DQS_DELAY_1", value)) |
1071 | AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle"); | 1097 | AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle"); |
1072 | 1098 | ||
1073 | if(helper.ReadRegisterField("DRAM", "CTL19", "DQS_OUT_SHIFT", value)) | 1099 | if(ReadFieldOld("DRAM", "CTL19", "DQS_OUT_SHIFT", value)) |
1074 | AddLine("DQS Out Delay", value, "", ""); | 1100 | AddLine("DQS Out Delay", value, "", ""); |
1075 | 1101 | ||
1076 | if(helper.ReadRegisterField("DRAM", "CTL20", "WR_DQS_SHIFT", value)) | 1102 | if(ReadFieldOld("DRAM", "CTL20", "WR_DQS_SHIFT", value)) |
1077 | AddLine("DQS Write Delay", value, "", ""); | 1103 | AddLine("DQS Write Delay", value, "", ""); |
1078 | } | 1104 | } |
1079 | 1105 | ||
@@ -1090,8 +1116,8 @@ namespace pin_desc | |||
1090 | #include "../../imxtools/misc/map.h" | 1116 | #include "../../imxtools/misc/map.h" |
1091 | } | 1117 | } |
1092 | 1118 | ||
1093 | PinAnalyser::PinAnalyser(const SocRef& soc, IoBackend *backend) | 1119 | PinAnalyser::PinAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend) |
1094 | :Analyser(soc, backend) | 1120 | :AnalyserEx(soc, backend) |
1095 | { | 1121 | { |
1096 | m_group = new QGroupBox("Pin Analyser"); | 1122 | m_group = new QGroupBox("Pin Analyser"); |
1097 | QVBoxLayout *layout = new QVBoxLayout; | 1123 | QVBoxLayout *layout = new QVBoxLayout; |
@@ -1129,7 +1155,6 @@ bool PinAnalyser::SupportSoc(const QString& soc_name) | |||
1129 | 1155 | ||
1130 | void PinAnalyser::FillList() | 1156 | void PinAnalyser::FillList() |
1131 | { | 1157 | { |
1132 | BackendHelper helper(m_io_backend, m_soc); | ||
1133 | soc_word_t value; | 1158 | soc_word_t value; |
1134 | 1159 | ||
1135 | while(m_panel->count() > 0) | 1160 | while(m_panel->count() > 0) |
@@ -1140,7 +1165,7 @@ void PinAnalyser::FillList() | |||
1140 | "bga169", "bga100", "lqfp100", "lqfp128", 0, 0, 0, 0 | 1165 | "bga169", "bga100", "lqfp100", "lqfp128", 0, 0, 0, 0 |
1141 | }; | 1166 | }; |
1142 | 1167 | ||
1143 | if(!helper.ReadRegisterField("DIGCTL", "STATUS", "PACKAGE_TYPE", value)) | 1168 | if(!ReadFieldOld("DIGCTL", "STATUS", "PACKAGE_TYPE", value)) |
1144 | { | 1169 | { |
1145 | m_package_edit->setText("<read error>"); | 1170 | m_package_edit->setText("<read error>"); |
1146 | return; | 1171 | return; |
@@ -1199,21 +1224,21 @@ void PinAnalyser::FillList() | |||
1199 | uint32_t muxsel[2], drive[4], pull, in, out, oe; | 1224 | uint32_t muxsel[2], drive[4], pull, in, out, oe; |
1200 | bool error = false; | 1225 | bool error = false; |
1201 | for(int i = 0; i < 2; i++) | 1226 | for(int i = 0; i < 2; i++) |
1202 | if(!helper.ReadRegister("PINCTRL", QString("MUXSEL%1").arg(bank * 2 + i), muxsel[i])) | 1227 | if(!ReadRegisterOld("PINCTRL", QString("MUXSELn[%1]").arg(bank * 2 + i), muxsel[i])) |
1203 | error = true; | 1228 | error = true; |
1204 | /* don't make an error for those since some do not exist */ | 1229 | /* don't make an error for those since some do not exist */ |
1205 | for(int i = 0; i < 4; i++) | 1230 | for(int i = 0; i < 4; i++) |
1206 | if(!helper.ReadRegister("PINCTRL", QString("DRIVE%1").arg(bank * 4 + i), drive[i])) | 1231 | if(!ReadRegisterOld("PINCTRL", QString("DRIVEn[%1]").arg(bank * 4 + i), drive[i])) |
1207 | drive[i] = 0; | 1232 | drive[i] = 0; |
1208 | if(error) | 1233 | if(error) |
1209 | continue; | 1234 | continue; |
1210 | if(!helper.ReadRegister("PINCTRL", QString("PULL%1").arg(bank), pull)) | 1235 | if(!ReadRegisterOld("PINCTRL", QString("PULLn[%1]").arg(bank), pull)) |
1211 | pull = 0; | 1236 | pull = 0; |
1212 | if(!helper.ReadRegister("PINCTRL", QString("DIN%1").arg(bank), in)) | 1237 | if(!ReadRegisterOld("PINCTRL", QString("DINn[%1]").arg(bank), in)) |
1213 | in = 0; | 1238 | in = 0; |
1214 | if(!helper.ReadRegister("PINCTRL", QString("DOUT%1").arg(bank), out)) | 1239 | if(!ReadRegisterOld("PINCTRL", QString("DOUTn[%1]").arg(bank), out)) |
1215 | out = 0; | 1240 | out = 0; |
1216 | if(!helper.ReadRegister("PINCTRL", QString("DOE%1").arg(bank), oe)) | 1241 | if(!ReadRegisterOld("PINCTRL", QString("DOEn[%1]").arg(bank), oe)) |
1217 | oe = 0; | 1242 | oe = 0; |
1218 | 1243 | ||
1219 | for(int pin = 0; pin < 32; pin++) | 1244 | for(int pin = 0; pin < 32; pin++) |
diff --git a/utils/regtools/qeditor/std_analysers.h b/utils/regtools/qeditor/std_analysers.h index 54e7b83862..030e010f58 100644 --- a/utils/regtools/qeditor/std_analysers.h +++ b/utils/regtools/qeditor/std_analysers.h | |||
@@ -35,14 +35,28 @@ | |||
35 | #include <QLineEdit> | 35 | #include <QLineEdit> |
36 | #include "analyser.h" | 36 | #include "analyser.h" |
37 | 37 | ||
38 | class AnalyserEx : public Analyser | ||
39 | { | ||
40 | public: | ||
41 | AnalyserEx(const soc_desc::soc_ref_t& soc, IoBackend *backend); | ||
42 | protected: | ||
43 | bool ReadRegister(const QString& path, soc_word_t& val); | ||
44 | bool ReadRegisterOld(const QString& dev, const QString& reg, soc_word_t& val); | ||
45 | bool ReadField(const QString& path, const QString& field, soc_word_t& val); | ||
46 | bool ReadFieldOld(const QString& dev, const QString& reg, const QString& field, | ||
47 | soc_word_t& val); | ||
48 | |||
49 | BackendHelper m_helper; | ||
50 | }; | ||
51 | |||
38 | /** | 52 | /** |
39 | * Clock analyser | 53 | * Clock analyser |
40 | */ | 54 | */ |
41 | 55 | ||
42 | class ClockAnalyser : public Analyser | 56 | class ClockAnalyser : public AnalyserEx |
43 | { | 57 | { |
44 | public: | 58 | public: |
45 | ClockAnalyser(const SocRef& soc, IoBackend *backend); | 59 | ClockAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend); |
46 | virtual ~ClockAnalyser(); | 60 | virtual ~ClockAnalyser(); |
47 | virtual QWidget *GetWidget(); | 61 | virtual QWidget *GetWidget(); |
48 | static bool SupportSoc(const QString& soc_name); | 62 | static bool SupportSoc(const QString& soc_name); |
@@ -72,11 +86,11 @@ private: | |||
72 | /** | 86 | /** |
73 | * EMI analyser | 87 | * EMI analyser |
74 | */ | 88 | */ |
75 | class EmiAnalyser : public QObject, public Analyser | 89 | class EmiAnalyser : public QObject, public AnalyserEx |
76 | { | 90 | { |
77 | Q_OBJECT | 91 | Q_OBJECT |
78 | public: | 92 | public: |
79 | EmiAnalyser(const SocRef& soc, IoBackend *backend); | 93 | EmiAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend); |
80 | virtual ~EmiAnalyser(); | 94 | virtual ~EmiAnalyser(); |
81 | virtual QWidget *GetWidget(); | 95 | virtual QWidget *GetWidget(); |
82 | 96 | ||
@@ -116,10 +130,10 @@ private: | |||
116 | /** | 130 | /** |
117 | * PINCTRL analyzer | 131 | * PINCTRL analyzer |
118 | */ | 132 | */ |
119 | class PinAnalyser : public Analyser | 133 | class PinAnalyser : public AnalyserEx |
120 | { | 134 | { |
121 | public: | 135 | public: |
122 | PinAnalyser(const SocRef& soc, IoBackend *backend); | 136 | PinAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend); |
123 | virtual ~PinAnalyser(); | 137 | virtual ~PinAnalyser(); |
124 | virtual QWidget *GetWidget(); | 138 | virtual QWidget *GetWidget(); |
125 | 139 | ||
diff --git a/utils/regtools/qeditor/utils.cpp b/utils/regtools/qeditor/utils.cpp index 95b5a80c64..0d0a7de5ed 100644 --- a/utils/regtools/qeditor/utils.cpp +++ b/utils/regtools/qeditor/utils.cpp | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <QXmlStreamReader> | 29 | #include <QXmlStreamReader> |
30 | #include <QXmlStreamWriter> | 30 | #include <QXmlStreamWriter> |
31 | #include <QTextBlock> | 31 | #include <QTextBlock> |
32 | #include <QApplication> | ||
32 | 33 | ||
33 | /** | 34 | /** |
34 | * SocBitRangeValidator | 35 | * SocBitRangeValidator |
@@ -36,6 +37,7 @@ | |||
36 | SocBitRangeValidator::SocBitRangeValidator(QObject *parent) | 37 | SocBitRangeValidator::SocBitRangeValidator(QObject *parent) |
37 | :QValidator(parent) | 38 | :QValidator(parent) |
38 | { | 39 | { |
40 | m_width = 32; | ||
39 | } | 41 | } |
40 | 42 | ||
41 | void SocBitRangeValidator::fixup(QString& input) const | 43 | void SocBitRangeValidator::fixup(QString& input) const |
@@ -66,11 +68,11 @@ QValidator::State SocBitRangeValidator::parse(const QString& input, int& last, i | |||
66 | // parse last bit and check it's between 0 and 31 | 68 | // parse last bit and check it's between 0 and 31 |
67 | bool ok = false; | 69 | bool ok = false; |
68 | last = input.left(pos).toInt(&ok); | 70 | last = input.left(pos).toInt(&ok); |
69 | if(!ok || last < 0 || last >= 32) | 71 | if(!ok || last < 0 || last >= m_width) |
70 | return Invalid; | 72 | return Invalid; |
71 | } | 73 | } |
72 | else | 74 | else |
73 | last = 31; | 75 | last = m_width - 1; |
74 | // parse first bit | 76 | // parse first bit |
75 | if(pos < input.size() - 1) | 77 | if(pos < input.size() - 1) |
76 | { | 78 | { |
@@ -88,6 +90,19 @@ QValidator::State SocBitRangeValidator::parse(const QString& input, int& last, i | |||
88 | return Acceptable; | 90 | return Acceptable; |
89 | } | 91 | } |
90 | 92 | ||
93 | void SocBitRangeValidator::setWidth(int nr_bits) | ||
94 | { | ||
95 | m_width = nr_bits; | ||
96 | } | ||
97 | |||
98 | QString SocBitRangeValidator::generate(int last_bit, int first_bit) const | ||
99 | { | ||
100 | if(last_bit == first_bit) | ||
101 | return QString("%1").arg(first_bit); | ||
102 | else | ||
103 | return QString("%1:%2").arg(last_bit).arg(first_bit); | ||
104 | } | ||
105 | |||
91 | /** | 106 | /** |
92 | * SocFieldValidator | 107 | * SocFieldValidator |
93 | */ | 108 | */ |
@@ -95,11 +110,11 @@ QValidator::State SocBitRangeValidator::parse(const QString& input, int& last, i | |||
95 | SocFieldValidator::SocFieldValidator(QObject *parent) | 110 | SocFieldValidator::SocFieldValidator(QObject *parent) |
96 | :QValidator(parent) | 111 | :QValidator(parent) |
97 | { | 112 | { |
98 | m_field.first_bit = 0; | 113 | m_field.pos = 0; |
99 | m_field.last_bit = 31; | 114 | m_field.width = 32; |
100 | } | 115 | } |
101 | 116 | ||
102 | SocFieldValidator::SocFieldValidator(const soc_reg_field_t& field, QObject *parent) | 117 | SocFieldValidator::SocFieldValidator(const soc_desc::field_t& field, QObject *parent) |
103 | :QValidator(parent), m_field(field) | 118 | :QValidator(parent), m_field(field) |
104 | { | 119 | { |
105 | } | 120 | } |
@@ -124,7 +139,7 @@ QValidator::State SocFieldValidator::parse(const QString& input, soc_word_t& val | |||
124 | return Intermediate; | 139 | return Intermediate; |
125 | // first check named values | 140 | // first check named values |
126 | State state = Invalid; | 141 | State state = Invalid; |
127 | foreach(const soc_reg_field_value_t& value, m_field.value) | 142 | foreach(const soc_desc::enum_t& value, m_field.enum_) |
128 | { | 143 | { |
129 | QString name = QString::fromLocal8Bit(value.name.c_str()); | 144 | QString name = QString::fromLocal8Bit(value.name.c_str()); |
130 | // cannot be a substring if too long or empty | 145 | // cannot be a substring if too long or empty |
@@ -176,7 +191,7 @@ QValidator::State SocFieldValidator::parse(const QString& input, soc_word_t& val | |||
176 | if(!ok) | 191 | if(!ok) |
177 | return state; | 192 | return state; |
178 | // if ok, check if it fits in the number of bits | 193 | // if ok, check if it fits in the number of bits |
179 | unsigned nr_bits = m_field.last_bit - m_field.first_bit + 1; | 194 | unsigned nr_bits = m_field.width; |
180 | unsigned long max = nr_bits == 32 ? 0xffffffff : (1 << nr_bits) - 1; | 195 | unsigned long max = nr_bits == 32 ? 0xffffffff : (1 << nr_bits) - 1; |
181 | if(v <= max) | 196 | if(v <= max) |
182 | { | 197 | { |
@@ -308,14 +323,22 @@ QString SocFieldItemDelegate::displayText(const QVariant& value, const QLocale& | |||
308 | return QStyledItemDelegate::displayText(value, locale); | 323 | return QStyledItemDelegate::displayText(value, locale); |
309 | } | 324 | } |
310 | 325 | ||
326 | void SocFieldItemDelegate::setWidth(int bitcount) | ||
327 | { | ||
328 | m_bitcount = bitcount; | ||
329 | } | ||
330 | |||
311 | /** | 331 | /** |
312 | * SocFieldEditor | 332 | * SocFieldEditor |
313 | */ | 333 | */ |
314 | SocFieldEditor::SocFieldEditor(const soc_reg_field_t& field, QWidget *parent) | 334 | SocFieldEditor::SocFieldEditor(const soc_desc::field_t& field, QWidget *parent) |
315 | :QLineEdit(parent), m_reg_field(field) | 335 | :QLineEdit(parent), m_reg_field(field) |
316 | { | 336 | { |
317 | m_validator = new SocFieldValidator(field); | 337 | m_validator = new SocFieldValidator(field); |
318 | setValidator(m_validator); | 338 | setValidator(m_validator); |
339 | connect(this, SIGNAL(editingFinished()), this, SLOT(editDone())); | ||
340 | setAlignment(Qt::AlignCenter); | ||
341 | setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); | ||
319 | } | 342 | } |
320 | 343 | ||
321 | SocFieldEditor::~SocFieldEditor() | 344 | SocFieldEditor::~SocFieldEditor() |
@@ -323,6 +346,11 @@ SocFieldEditor::~SocFieldEditor() | |||
323 | delete m_validator; | 346 | delete m_validator; |
324 | } | 347 | } |
325 | 348 | ||
349 | void SocFieldEditor::editDone() | ||
350 | { | ||
351 | emit editingFinished(field()); | ||
352 | } | ||
353 | |||
326 | uint SocFieldEditor::field() const | 354 | uint SocFieldEditor::field() const |
327 | { | 355 | { |
328 | soc_word_t v; | 356 | soc_word_t v; |
@@ -336,11 +364,11 @@ uint SocFieldEditor::field() const | |||
336 | void SocFieldEditor::setField(uint field) | 364 | void SocFieldEditor::setField(uint field) |
337 | { | 365 | { |
338 | m_field = field; | 366 | m_field = field; |
339 | int digits = (m_reg_field.last_bit - m_reg_field.first_bit + 4) / 4; | 367 | int digits = (m_reg_field.width + 3) / 4; |
340 | setText(QString("0x%1").arg(field, digits, 16, QChar('0'))); | 368 | setText(QString("0x%1").arg(field, digits, 16, QChar('0'))); |
341 | } | 369 | } |
342 | 370 | ||
343 | void SocFieldEditor::SetRegField(const soc_reg_field_t& field) | 371 | void SocFieldEditor::SetRegField(const soc_desc::field_t& field) |
344 | { | 372 | { |
345 | setValidator(0); | 373 | setValidator(0); |
346 | delete m_validator; | 374 | delete m_validator; |
@@ -352,12 +380,30 @@ void SocFieldEditor::SetRegField(const soc_reg_field_t& field) | |||
352 | /** | 380 | /** |
353 | * SocFieldCachedValue | 381 | * SocFieldCachedValue |
354 | */ | 382 | */ |
355 | SocFieldCachedValue::SocFieldCachedValue(const soc_reg_field_t& field, uint value) | 383 | SocFieldCachedValue::SocFieldCachedValue(const soc_desc::field_t& field, uint value) |
356 | :m_field(field), m_value(value) | 384 | :m_field(field), m_value(value) |
357 | { | 385 | { |
358 | int idx = field.find_value(value); | 386 | int idx = field.find_value(value); |
359 | if(idx != -1) | 387 | if(idx != -1) |
360 | m_name = QString::fromStdString(field.value[idx].name); | 388 | m_name = QString::fromStdString(field.enum_[idx].name); |
389 | } | ||
390 | |||
391 | bool SocFieldCachedValue::operator<(const SocFieldCachedValue& o) const | ||
392 | { | ||
393 | return m_value < o.m_value; | ||
394 | } | ||
395 | |||
396 | /** | ||
397 | * SocFieldBitRange | ||
398 | */ | ||
399 | |||
400 | bool SocFieldBitRange::operator<(const SocFieldBitRange& o) const | ||
401 | { | ||
402 | if(m_first_bit < o.m_first_bit) | ||
403 | return true; | ||
404 | if(m_first_bit > o.m_first_bit) | ||
405 | return false; | ||
406 | return m_last_bit < o.m_last_bit; | ||
361 | } | 407 | } |
362 | 408 | ||
363 | /** | 409 | /** |
@@ -372,11 +418,10 @@ SocFieldCachedItemDelegate::SocFieldCachedItemDelegate(QObject *parent) | |||
372 | 418 | ||
373 | QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLocale& locale) const | 419 | QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLocale& locale) const |
374 | { | 420 | { |
375 | // FIXME see QTBUG-30392 | 421 | if(isUserType< SocFieldCachedValue >(value)) |
376 | if(value.type() == QVariant::UserType && value.userType() == qMetaTypeId< SocFieldCachedValue >()) | ||
377 | { | 422 | { |
378 | const SocFieldCachedValue& v = value.value< SocFieldCachedValue >(); | 423 | const SocFieldCachedValue& v = value.value< SocFieldCachedValue >(); |
379 | int bitcount = v.field().last_bit - v.field().first_bit; | 424 | int bitcount = v.field().width; |
380 | QString name = v.value_name(); | 425 | QString name = v.value_name(); |
381 | QString strval = QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0')); | 426 | QString strval = QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0')); |
382 | switch(m_mode) | 427 | switch(m_mode) |
@@ -410,7 +455,7 @@ QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLo | |||
410 | * SocFieldCachedEditor | 455 | * SocFieldCachedEditor |
411 | */ | 456 | */ |
412 | SocFieldCachedEditor::SocFieldCachedEditor(QWidget *parent) | 457 | SocFieldCachedEditor::SocFieldCachedEditor(QWidget *parent) |
413 | :SocFieldEditor(soc_reg_field_t(), parent) | 458 | :SocFieldEditor(soc_desc::field_t(), parent) |
414 | { | 459 | { |
415 | } | 460 | } |
416 | 461 | ||
@@ -443,6 +488,11 @@ QByteArray SocFieldEditorCreator::valuePropertyName() const | |||
443 | return QByteArray("field"); | 488 | return QByteArray("field"); |
444 | } | 489 | } |
445 | 490 | ||
491 | void SocFieldEditorCreator::setWidth(int bitcount) | ||
492 | { | ||
493 | m_field.width = bitcount; | ||
494 | } | ||
495 | |||
446 | /** | 496 | /** |
447 | * SocFieldCachedEditorCreator | 497 | * SocFieldCachedEditorCreator |
448 | */ | 498 | */ |
@@ -478,8 +528,10 @@ int RegFieldTableModel::columnCount(const QModelIndex& /* parent */) const | |||
478 | 528 | ||
479 | QVariant RegFieldTableModel::data(const QModelIndex& index, int role) const | 529 | QVariant RegFieldTableModel::data(const QModelIndex& index, int role) const |
480 | { | 530 | { |
531 | if(index.row() < 0 || (size_t)index.row() >= m_reg.field.size()) | ||
532 | return QVariant(); | ||
481 | int section = index.column(); | 533 | int section = index.column(); |
482 | const soc_reg_field_t& field = m_reg.field[index.row()]; | 534 | const soc_desc::field_t& field = m_reg.field[index.row()]; |
483 | /* column independent code */ | 535 | /* column independent code */ |
484 | const RegThemeGroup *theme = 0; | 536 | const RegThemeGroup *theme = 0; |
485 | switch(m_status[index.row()]) | 537 | switch(m_status[index.row()]) |
@@ -609,7 +661,7 @@ void RegFieldTableModel::SetReadOnly(bool en) | |||
609 | m_read_only = en; | 661 | m_read_only = en; |
610 | } | 662 | } |
611 | 663 | ||
612 | void RegFieldTableModel::SetRegister(const soc_reg_t& reg) | 664 | void RegFieldTableModel::SetRegister(const soc_desc::register_t& reg) |
613 | { | 665 | { |
614 | /* remove all rows */ | 666 | /* remove all rows */ |
615 | beginResetModel(); | 667 | beginResetModel(); |
@@ -622,6 +674,18 @@ void RegFieldTableModel::SetRegister(const soc_reg_t& reg) | |||
622 | endInsertRows(); | 674 | endInsertRows(); |
623 | } | 675 | } |
624 | 676 | ||
677 | void RegFieldTableModel::UpdateRegister(const soc_desc::register_t& reg) | ||
678 | { | ||
679 | m_reg = reg; | ||
680 | RecomputeTheme(); | ||
681 | emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); | ||
682 | } | ||
683 | |||
684 | soc_desc::register_t RegFieldTableModel::GetRegister() const | ||
685 | { | ||
686 | return m_reg; | ||
687 | } | ||
688 | |||
625 | void RegFieldTableModel::SetValues(const QVector< QVariant >& values) | 689 | void RegFieldTableModel::SetValues(const QVector< QVariant >& values) |
626 | { | 690 | { |
627 | /* remove all value columns */ | 691 | /* remove all value columns */ |
@@ -658,7 +722,7 @@ void RegFieldTableModel::RecomputeTheme() | |||
658 | if(!m_theme.valid || m_value.size() == 0) | 722 | if(!m_theme.valid || m_value.size() == 0) |
659 | continue; | 723 | continue; |
660 | m_status[i] = Normal; | 724 | m_status[i] = Normal; |
661 | const soc_reg_field_t& field = m_reg.field[i]; | 725 | const soc_desc::field_t& field = m_reg.field[i]; |
662 | QVariant val; | 726 | QVariant val; |
663 | for(int j = 0; j < m_value.size(); j++) | 727 | for(int j = 0; j < m_value.size(); j++) |
664 | { | 728 | { |
@@ -675,120 +739,269 @@ void RegFieldTableModel::RecomputeTheme() | |||
675 | } | 739 | } |
676 | 740 | ||
677 | /** | 741 | /** |
678 | * RegSexyDisplay2 | 742 | * RegFieldProxyModel |
679 | */ | 743 | */ |
680 | 744 | ||
681 | RegSexyDisplay2::RegSexyDisplay2(QWidget *parent) | 745 | bool RegFieldProxyModel::lessThan(const QModelIndex& left, |
746 | const QModelIndex& right) const | ||
747 | { | ||
748 | QVariant ldata = sourceModel()->data(left); | ||
749 | QVariant rdata = sourceModel()->data(right); | ||
750 | if(isUserType< SocFieldBitRange >(ldata) && | ||
751 | isUserType< SocFieldBitRange >(rdata)) | ||
752 | { | ||
753 | return ldata.value< SocFieldBitRange >() < | ||
754 | rdata.value< SocFieldBitRange >(); | ||
755 | } | ||
756 | else if(isUserType< SocFieldCachedValue >(ldata) && | ||
757 | isUserType< SocFieldCachedValue >(rdata)) | ||
758 | { | ||
759 | return ldata.value< SocFieldCachedValue >() < | ||
760 | rdata.value< SocFieldCachedValue >(); | ||
761 | } | ||
762 | else | ||
763 | return QSortFilterProxyModel::lessThan(left, right); | ||
764 | } | ||
765 | |||
766 | /** | ||
767 | * YRegDisplayItemDelegate | ||
768 | */ | ||
769 | |||
770 | YRegDisplayItemDelegate::YRegDisplayItemDelegate(QObject *parent) | ||
771 | :QStyledItemDelegate(parent) | ||
772 | { | ||
773 | } | ||
774 | |||
775 | void YRegDisplayItemDelegate::paint(QPainter *painter, | ||
776 | const QStyleOptionViewItem& option, const QModelIndex& index) const | ||
777 | { | ||
778 | QStyleOptionViewItemV4 opt = option; | ||
779 | // default alignment is centered unless specified | ||
780 | opt.displayAlignment = Qt::AlignHCenter | Qt::AlignVCenter; | ||
781 | initStyleOption(&opt, index); | ||
782 | |||
783 | painter->save(); | ||
784 | // draw everything rotated, requires careful manipulation of the | ||
785 | // rects involved | ||
786 | painter->translate(opt.rect.bottomLeft()); | ||
787 | painter->rotate(-90); | ||
788 | opt.rect = QRect(0, 0, opt.rect.height(), opt.rect.width()); | ||
789 | QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); | ||
790 | style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); | ||
791 | painter->restore(); | ||
792 | |||
793 | } | ||
794 | |||
795 | QSize YRegDisplayItemDelegate::sizeHint(const QStyleOptionViewItem& option, | ||
796 | const QModelIndex& index) const | ||
797 | { | ||
798 | Q_UNUSED(option); | ||
799 | Q_UNUSED(index); | ||
800 | return QSize(); | ||
801 | } | ||
802 | |||
803 | /** | ||
804 | * YRegDisplay | ||
805 | */ | ||
806 | |||
807 | YRegDisplay::YRegDisplay(QWidget *parent) | ||
682 | :QAbstractItemView(parent) | 808 | :QAbstractItemView(parent) |
683 | { | 809 | { |
684 | m_is_dirty = true; | 810 | m_is_dirty = true; |
811 | m_range_col = 0; | ||
812 | m_data_col = 1; | ||
813 | m_nr_bits = 32; | ||
685 | // the frame around the register is ugly, disable it | 814 | // the frame around the register is ugly, disable it |
686 | setFrameShape(QFrame::NoFrame); | 815 | setFrameShape(QFrame::NoFrame); |
816 | setSelectionMode(SingleSelection); | ||
817 | setItemDelegate(new YRegDisplayItemDelegate()); | ||
687 | } | 818 | } |
688 | 819 | ||
689 | QModelIndex RegSexyDisplay2::indexAt(const QPoint& point) const | 820 | void YRegDisplay::setWidth(int nr_bits) |
690 | { | 821 | { |
691 | Q_UNUSED(point); | 822 | m_nr_bits = nr_bits; |
823 | m_is_dirty = true; | ||
824 | recomputeGeometry(); | ||
825 | updateGeometries(); | ||
826 | } | ||
827 | |||
828 | int YRegDisplay::bitColumnAt(const QPoint& point, bool closest) const | ||
829 | { | ||
830 | int wx = point.x() + horizontalScrollBar()->value(); | ||
831 | for(int bit = 0; bit < m_nr_bits; bit++) | ||
832 | { | ||
833 | int off = columnOffset(bitToColumn(bit)); | ||
834 | int w = columnWidth(bitToColumn(bit)); | ||
835 | if(wx >= off && wx < off + w) | ||
836 | return bit; | ||
837 | if(wx >= off + w && closest) | ||
838 | return bit; | ||
839 | } | ||
840 | return closest ? m_nr_bits - 1 : -1; | ||
841 | } | ||
842 | |||
843 | QModelIndex YRegDisplay::indexAt(const QPoint& point) const | ||
844 | { | ||
845 | if(!model()) | ||
846 | return QModelIndex(); | ||
847 | int wx = point.x() + horizontalScrollBar()->value(); | ||
848 | int wy = point.y() + verticalScrollBar()->value(); | ||
849 | |||
850 | for(int i = 0; i < model()->rowCount(); i++) | ||
851 | { | ||
852 | QModelIndex index = model()->index(i, m_data_col, rootIndex()); | ||
853 | QRect r = itemRect(index); | ||
854 | if(!r.isValid()) | ||
855 | continue; | ||
856 | if(r.contains(wx, wy)) | ||
857 | return index; | ||
858 | } | ||
692 | return QModelIndex(); | 859 | return QModelIndex(); |
693 | } | 860 | } |
694 | 861 | ||
695 | void RegSexyDisplay2::scrollTo(const QModelIndex& index, ScrollHint hint) | 862 | void YRegDisplay::scrollTo(const QModelIndex& index, ScrollHint hint) |
696 | { | 863 | { |
697 | Q_UNUSED(index); | 864 | Q_UNUSED(index); |
698 | Q_UNUSED(hint); | 865 | Q_UNUSED(hint); |
699 | } | 866 | } |
700 | 867 | ||
701 | QRect RegSexyDisplay2::visualRect(const QModelIndex& index) const | 868 | QRect YRegDisplay::visualRect(const QModelIndex &index) const |
702 | { | 869 | { |
703 | Q_UNUSED(index); | 870 | QRect rect = itemRect(index); |
704 | return QRect(); | 871 | if(rect.isValid()) |
872 | return QRect(rect.left() - horizontalScrollBar()->value(), | ||
873 | rect.top() - verticalScrollBar()->value(), | ||
874 | rect.width(), rect.height()); | ||
875 | else | ||
876 | return rect; | ||
705 | } | 877 | } |
706 | 878 | ||
707 | bool RegSexyDisplay2::isIndexHidden(const QModelIndex& index) const | 879 | bool YRegDisplay::isIndexHidden(const QModelIndex& index) const |
708 | { | 880 | { |
709 | Q_UNUSED(index); | 881 | Q_UNUSED(index); |
710 | return false; | 882 | return false; |
711 | } | 883 | } |
712 | 884 | ||
713 | QModelIndex RegSexyDisplay2::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) | 885 | QModelIndex YRegDisplay::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) |
714 | { | 886 | { |
715 | Q_UNUSED(cursorAction); | 887 | Q_UNUSED(cursorAction); |
716 | Q_UNUSED(modifiers); | 888 | Q_UNUSED(modifiers); |
717 | return QModelIndex(); | 889 | return QModelIndex(); |
718 | } | 890 | } |
719 | 891 | ||
720 | void RegSexyDisplay2::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) | 892 | void YRegDisplay::setSelection(const QRect& r, QItemSelectionModel::SelectionFlags flags) |
721 | { | 893 | { |
722 | Q_UNUSED(rect); | 894 | if(!model()) |
723 | Q_UNUSED(flags); | 895 | return; |
896 | QRect rect = r.translated(horizontalScrollBar()->value(), | ||
897 | verticalScrollBar()->value()).normalized(); | ||
898 | |||
899 | QItemSelection sel; | ||
900 | for(int i = 0; i < model()->rowCount(); i++) | ||
901 | { | ||
902 | QModelIndex index = model()->index(i, m_data_col, rootIndex()); | ||
903 | QRect r = itemRect(index); | ||
904 | if(!r.isValid()) | ||
905 | continue; | ||
906 | if(r.intersects(rect)) | ||
907 | sel.select(index, index); | ||
908 | } | ||
909 | selectionModel()->select(sel, flags); | ||
724 | } | 910 | } |
725 | 911 | ||
726 | int RegSexyDisplay2::verticalOffset() const | 912 | int YRegDisplay::verticalOffset() const |
727 | { | 913 | { |
728 | return verticalScrollBar()->value(); | 914 | return verticalScrollBar()->value(); |
729 | } | 915 | } |
730 | 916 | ||
731 | int RegSexyDisplay2::horizontalOffset() const | 917 | int YRegDisplay::horizontalOffset() const |
732 | { | 918 | { |
733 | return horizontalScrollBar()->value(); | 919 | return horizontalScrollBar()->value(); |
734 | } | 920 | } |
735 | 921 | ||
736 | void RegSexyDisplay2::scrollContentsBy(int dx, int dy) | 922 | void YRegDisplay::scrollContentsBy(int dx, int dy) |
737 | { | 923 | { |
738 | viewport()->scroll(dx, dy); | 924 | viewport()->scroll(dx, dy); |
739 | } | 925 | } |
740 | 926 | ||
741 | void RegSexyDisplay2::setModel(QAbstractItemModel *model) | 927 | void YRegDisplay::setModel(QAbstractItemModel *model) |
742 | { | 928 | { |
743 | QAbstractItemView::setModel(model); | 929 | QAbstractItemView::setModel(model); |
744 | m_is_dirty = true; | 930 | m_is_dirty = true; |
745 | } | 931 | } |
746 | 932 | ||
747 | void RegSexyDisplay2::dataChanged(const QModelIndex &topLeft, | 933 | void YRegDisplay::dataChanged(const QModelIndex &topLeft, |
748 | const QModelIndex &bottomRight) | 934 | const QModelIndex &bottomRight) |
749 | { | 935 | { |
750 | m_is_dirty = true; | 936 | m_is_dirty = true; |
751 | QAbstractItemView::dataChanged(topLeft, bottomRight); | 937 | QAbstractItemView::dataChanged(topLeft, bottomRight); |
752 | } | 938 | } |
753 | 939 | ||
754 | void RegSexyDisplay2::rowsInserted(const QModelIndex &parent, int start, int end) | 940 | void YRegDisplay::rowsInserted(const QModelIndex &parent, int start, int end) |
755 | { | 941 | { |
756 | m_is_dirty = true; | 942 | m_is_dirty = true; |
757 | QAbstractItemView::rowsInserted(parent, start, end); | 943 | QAbstractItemView::rowsInserted(parent, start, end); |
758 | } | 944 | } |
759 | 945 | ||
760 | void RegSexyDisplay2::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) | 946 | void YRegDisplay::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) |
761 | { | 947 | { |
762 | m_is_dirty = true; | 948 | m_is_dirty = true; |
763 | QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); | 949 | QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); |
764 | } | 950 | } |
765 | 951 | ||
766 | int RegSexyDisplay2::GetSeparatorSize() const | 952 | int YRegDisplay::separatorSize() const |
767 | { | 953 | { |
768 | return 1; | 954 | return 1; |
769 | } | 955 | } |
770 | 956 | ||
771 | int RegSexyDisplay2::GetMarginSize() const | 957 | int YRegDisplay::marginSize() const |
772 | { | 958 | { |
773 | return viewOptions().fontMetrics.height() / 3; | 959 | return viewOptions().fontMetrics.height() / 3; |
774 | } | 960 | } |
775 | 961 | ||
776 | int RegSexyDisplay2::GetHeaderTextSep() const | 962 | int YRegDisplay::headerTextSep() const |
777 | { | 963 | { |
778 | return GetMarginSize() / 2; | 964 | return marginSize() / 2; |
779 | } | 965 | } |
780 | 966 | ||
781 | int RegSexyDisplay2::GetHeaderHeight() const | 967 | int YRegDisplay::headerHeight() const |
782 | { | 968 | { |
783 | return 2 * GetMarginSize() + GetHeaderTextSep() + 2 * viewOptions().fontMetrics.height(); | 969 | return 2 * marginSize() + headerTextSep() + 2 * viewOptions().fontMetrics.height(); |
784 | } | 970 | } |
785 | 971 | ||
786 | int RegSexyDisplay2::GetColumnWidth() const | 972 | int YRegDisplay::minColumnWidth() const |
787 | { | 973 | { |
788 | return 2 * GetMarginSize() + viewOptions().fontMetrics.height(); | 974 | return 2 * marginSize() + viewOptions().fontMetrics.height(); |
789 | } | 975 | } |
790 | 976 | ||
791 | int RegSexyDisplay2::GetMaxContentHeight() const | 977 | int YRegDisplay::maxColumnWidth() const |
978 | { | ||
979 | return 2 * minColumnWidth(); | ||
980 | } | ||
981 | |||
982 | int YRegDisplay::columnWidth(int col) const | ||
983 | { | ||
984 | int avail = width() - (m_nr_bits + 1) * separatorSize(); | ||
985 | int small_w = qMin(avail / m_nr_bits, maxColumnWidth()); | ||
986 | int nr_big = avail - small_w * m_nr_bits; | ||
987 | if(col < nr_big) | ||
988 | return small_w + 1; | ||
989 | else | ||
990 | return small_w; | ||
991 | } | ||
992 | |||
993 | int YRegDisplay::columnOffset(int col) const | ||
994 | { | ||
995 | int off = separatorSize(); | ||
996 | for(int i = 0; i < col; i++) | ||
997 | off += columnWidth(i) + separatorSize(); | ||
998 | int all_w = off; | ||
999 | for(int i = col; i < m_nr_bits; i++) | ||
1000 | all_w += columnWidth(i) + separatorSize(); | ||
1001 | return off + (width() - all_w) / 2; | ||
1002 | } | ||
1003 | |||
1004 | int YRegDisplay::maxContentHeight() const | ||
792 | { | 1005 | { |
793 | int max = 0; | 1006 | int max = 0; |
794 | QFontMetrics metrics = viewOptions().fontMetrics; | 1007 | QFontMetrics metrics = viewOptions().fontMetrics; |
@@ -796,127 +1009,180 @@ int RegSexyDisplay2::GetMaxContentHeight() const | |||
796 | { | 1009 | { |
797 | for(int i = 0; i < model()->rowCount(); i++) | 1010 | for(int i = 0; i < model()->rowCount(); i++) |
798 | { | 1011 | { |
799 | QModelIndex index = model()->index(i, 1, rootIndex()); | 1012 | QModelIndex index = model()->index(i, m_data_col, rootIndex()); |
800 | QString s = model()->data(index).toString(); | 1013 | QString s = model()->data(index).toString(); |
801 | max = qMax(max, metrics.boundingRect(s).width()); | 1014 | max = qMax(max, metrics.boundingRect(s).width()); |
802 | } | 1015 | } |
803 | } | 1016 | } |
804 | return 2 * GetMarginSize() + max; | 1017 | return 2 * marginSize() + max; |
805 | } | 1018 | } |
806 | 1019 | ||
807 | int RegSexyDisplay2::GetGapHeight() const | 1020 | int YRegDisplay::gapHeight() const |
808 | { | 1021 | { |
809 | return GetMarginSize() / 2; | 1022 | return marginSize() / 2; |
810 | } | 1023 | } |
811 | 1024 | ||
812 | QRegion RegSexyDisplay2::visualRegionForSelection(const QItemSelection& selection) const | 1025 | int YRegDisplay::bitToColumn(int bit) const |
813 | { | 1026 | { |
814 | Q_UNUSED(selection); | 1027 | return m_nr_bits - 1 - bit; |
815 | return QRegion(); | ||
816 | } | 1028 | } |
817 | 1029 | ||
818 | void RegSexyDisplay2::paintEvent(QPaintEvent *event) | 1030 | QRegion YRegDisplay::visualRegionForSelection(const QItemSelection& selection) const |
819 | { | 1031 | { |
820 | Q_UNUSED(event); | 1032 | QRegion region; |
821 | int txt_h = viewOptions().fontMetrics.height(); | 1033 | foreach(const QItemSelectionRange &range, selection) |
822 | int sep_sz = GetSeparatorSize(); | 1034 | { |
823 | int w = qMax(m_minimum_width, viewport()->width()); | 1035 | for(int row = range.top(); row <= range.bottom(); ++row) |
824 | int h = qMax(m_minimum_height, viewport()->height()); | 1036 | { |
825 | int nr_bits = 32; | 1037 | for(int column = range.left(); column < range.right(); ++column) |
826 | int col_w = (w - (nr_bits + 1) * sep_sz) / nr_bits; | 1038 | { |
827 | int hdr_h = GetHeaderHeight(); | 1039 | QModelIndex index = model()->index(row, column, rootIndex()); |
828 | int gap_h = GetGapHeight(); | 1040 | region += visualRect(index); |
829 | int tot_w = (nr_bits + 1) * sep_sz + nr_bits * col_w; | 1041 | } |
830 | int margin = GetMarginSize(); | 1042 | } |
831 | int txt_sep = GetHeaderTextSep(); | 1043 | } |
832 | int tot_hdr_sz = 2 * sep_sz + hdr_h; | 1044 | return region; |
833 | 1045 | } | |
834 | int x_shift = (w - tot_w) / 2; | ||
835 | #define ith_col_x(i) (x_shift + (i) * (sep_sz + col_w)) | ||
836 | 1046 | ||
1047 | QRect YRegDisplay::itemRect(const QModelIndex& index) const | ||
1048 | { | ||
1049 | if(!index.isValid()) | ||
1050 | return QRect(); | ||
1051 | QVariant vrange = model()->data(model()->index(index.row(), m_range_col, rootIndex())); | ||
1052 | if(!vrange.canConvert< SocFieldBitRange >()) | ||
1053 | return QRect(); | ||
1054 | SocFieldBitRange range = vrange.value< SocFieldBitRange >(); | ||
1055 | return itemRect(range, index.column()); | ||
1056 | } | ||
1057 | |||
1058 | QRect YRegDisplay::itemRect(const SocFieldBitRange& range, int col) const | ||
1059 | { | ||
1060 | int top, bot; | ||
1061 | if(col == m_range_col) | ||
1062 | { | ||
1063 | top = separatorSize(); | ||
1064 | bot = separatorSize() + headerHeight() - 1; | ||
1065 | } | ||
1066 | else if(col == m_data_col) | ||
1067 | { | ||
1068 | top = headerHeight() + 3 * separatorSize() + gapHeight(); | ||
1069 | bot = height() - separatorSize() - 1; | ||
1070 | } | ||
1071 | else | ||
1072 | return QRect(); | ||
1073 | int first_col = bitToColumn(range.GetFirstBit()); | ||
1074 | return QRect(QPoint(columnOffset(bitToColumn(range.GetLastBit())), top), | ||
1075 | QPoint(columnOffset(first_col) + columnWidth(first_col) - 1, bot)); | ||
1076 | } | ||
1077 | |||
1078 | void YRegDisplay::paintEvent(QPaintEvent *event) | ||
1079 | { | ||
1080 | Q_UNUSED(event); | ||
837 | QPainter painter(viewport()); | 1081 | QPainter painter(viewport()); |
838 | painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); | 1082 | painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); |
839 | painter.translate(-horizontalScrollBar()->value(), -verticalScrollBar()->value()); | 1083 | painter.translate(-horizontalScrollBar()->value(), -verticalScrollBar()->value()); |
840 | QStyleOptionViewItem option = viewOptions(); | 1084 | QStyleOptionViewItem option = viewOptions(); |
1085 | int txt_h = option.fontMetrics.height(); | ||
1086 | int grid_hint = style()->styleHint(QStyle::SH_Table_GridLineColor, &option, this); | ||
1087 | QBrush grid_brush(static_cast< QRgb >(grid_hint)); | ||
841 | QBrush back_brush = option.palette.base(); | 1088 | QBrush back_brush = option.palette.base(); |
842 | QBrush line_brush = option.palette.dark(); | 1089 | int sep_sz = separatorSize(); |
843 | 1090 | QItemSelectionModel *selections = selectionModel(); | |
844 | // fill interesting zone with base | 1091 | |
845 | painter.fillRect(event->rect(), option.palette.window()); | 1092 | // paint header |
846 | painter.fillRect(x_shift, 0, tot_w, h, back_brush); | 1093 | for(int bit = 0; bit < m_nr_bits; bit++) |
847 | |||
848 | // draw top and bottom lines | ||
849 | painter.setPen(QPen(line_brush, sep_sz)); | ||
850 | painter.fillRect(x_shift, 0, tot_w, sep_sz, line_brush); | ||
851 | painter.fillRect(x_shift, h - sep_sz, tot_w, sep_sz, line_brush); | ||
852 | // draw intemediate lines | ||
853 | for(int i = 0; i <= 32; i++) | ||
854 | painter.fillRect(ith_col_x(i), 0, sep_sz, 2 * sep_sz + hdr_h, line_brush); | ||
855 | // draw bottom header lines | ||
856 | painter.fillRect(ith_col_x(0), sep_sz + hdr_h, tot_w, sep_sz, line_brush); | ||
857 | painter.fillRect(ith_col_x(0), tot_hdr_sz + gap_h, tot_w, sep_sz, line_brush); | ||
858 | // redraw some lines but wider | ||
859 | for(int i = 4; i < nr_bits; i += 4) | ||
860 | painter.fillRect(ith_col_x(i) - sep_sz, 0, 3 * sep_sz, tot_hdr_sz, line_brush); | ||
861 | // draw numbers in the header | ||
862 | painter.setPen(palette().brush(QPalette::ButtonText).color()); | ||
863 | for(int i = 0; i < nr_bits; i++) | ||
864 | { | 1094 | { |
865 | QRect r(ith_col_x(i), sep_sz + margin, col_w, txt_h); | 1095 | QRect r = itemRect(SocFieldBitRange(bit, bit), m_range_col); |
866 | painter.drawText(r, Qt::AlignCenter, QString("%1").arg((nr_bits - 1 - i) / 10)); | 1096 | // paint background |
867 | r.translate(0, txt_h + txt_sep); | 1097 | painter.fillRect(r, back_brush); |
868 | painter.drawText(r, Qt::AlignCenter, QString("%1").arg((nr_bits - 1 - i) % 10)); | 1098 | // paint top digit |
1099 | r.setTop(r.top() + marginSize()); | ||
1100 | r.setBottom(r.top() + txt_h); | ||
1101 | style()->drawItemText(&painter, r, Qt::AlignHCenter, option.palette, | ||
1102 | true, QString("%1").arg(bit / 10), foregroundRole()); | ||
1103 | // paint bottom digit | ||
1104 | r.setTop(r.bottom() + headerTextSep()); | ||
1105 | r.setBottom(r.top() + txt_h); | ||
1106 | style()->drawItemText(&painter, r, Qt::AlignHCenter, option.palette, | ||
1107 | true, QString("%1").arg(bit % 10), foregroundRole()); | ||
869 | } | 1108 | } |
870 | // display content | 1109 | // paint header grid |
871 | if(model()) | 1110 | for(int bit = 1; bit < m_nr_bits; bit++) |
872 | { | 1111 | { |
873 | for(int i = 0; i < model()->rowCount(); i++) | 1112 | QRect r = itemRect(SocFieldBitRange(bit, bit), m_range_col); |
874 | { | 1113 | r.setCoords(r.right() + 1, r.top(), r.right() + sep_sz, r.bottom()); |
875 | QVariant vrange = model()->data(model()->index(i, 0, rootIndex())); | 1114 | if((bit % 4) == 0) |
876 | if(!vrange.canConvert< SocFieldBitRange >()) | 1115 | r.setCoords(r.left() - sep_sz, r.top(), r.right() + sep_sz, r.bottom()); |
877 | continue; | 1116 | painter.fillRect(r, grid_brush); |
878 | SocFieldBitRange range = vrange.value< SocFieldBitRange >(); | 1117 | } |
879 | QString name = model()->data(model()->index(i, 1, rootIndex())).toString(); | 1118 | QRect hdr_r = itemRect(SocFieldBitRange(0, m_nr_bits - 1), m_range_col); |
880 | QRect r(QPoint(ith_col_x(nr_bits - 1 - range.GetLastBit()) + sep_sz, tot_hdr_sz), | 1119 | painter.fillRect(QRect(hdr_r.left(), hdr_r.top() - sep_sz, hdr_r.width(), sep_sz), grid_brush); |
881 | QPoint(ith_col_x(nr_bits - range.GetFirstBit()), h - sep_sz)); | 1120 | painter.fillRect(QRect(hdr_r.left(), hdr_r.bottom() + 1, hdr_r.width(), sep_sz), grid_brush); |
882 | painter.fillRect(r.x() - sep_sz, r.y(), sep_sz, r.height(), line_brush); | 1121 | // paint header gap |
883 | painter.fillRect(r.right(), r.y(), sep_sz, r.height(), line_brush); | 1122 | QRect gap_r(hdr_r.left(), hdr_r.bottom() + sep_sz + 1, hdr_r.width(), gapHeight()); |
884 | r.setY(r.y() + gap_h + sep_sz); | 1123 | painter.fillRect(gap_r, back_brush); |
885 | // draw rotated text | 1124 | // paint header bottom line |
886 | painter.save(); | 1125 | painter.fillRect(QRect(gap_r.left(), gap_r.bottom() + 1, gap_r.width(), sep_sz), grid_brush); |
887 | painter.translate(r.bottomLeft()); | 1126 | // paint background |
888 | painter.rotate(-90); | 1127 | QRect data_r = itemRect(SocFieldBitRange(0, m_nr_bits - 1), m_data_col); |
889 | //painter.fillRect(QRect(0, 0, r.height(), r.width()), QBrush(Qt::red)); | 1128 | //painter.fillRect(data_r, back_brush); |
890 | QRect r2(0, 0, r.height(), r.width()); | 1129 | // paint data bottom line |
891 | painter.drawText(r2, Qt::AlignCenter, name); | 1130 | painter.fillRect(QRect(data_r.left(), data_r.bottom() + 1, data_r.width(), sep_sz), grid_brush); |
892 | painter.restore(); | 1131 | // paint left/right lines |
893 | } | 1132 | painter.fillRect(QRect(hdr_r.left() - sep_sz, hdr_r.top() - sep_sz, sep_sz, height()), grid_brush); |
1133 | painter.fillRect(QRect(hdr_r.right() + 1, hdr_r.top() - sep_sz, sep_sz, height()), grid_brush); | ||
1134 | |||
1135 | // paint model | ||
1136 | if(!model()) | ||
1137 | return; | ||
1138 | |||
1139 | for(int i = 0; i < model()->rowCount(); i++) | ||
1140 | { | ||
1141 | QModelIndex index = model()->index(i, m_data_col, rootIndex()); | ||
1142 | QRect r = itemRect(index); | ||
1143 | if(!r.isValid()) | ||
1144 | continue; | ||
1145 | QString name = index.data().toString(); | ||
1146 | // paint background | ||
1147 | QStyleOptionViewItem opt = viewOptions(); | ||
1148 | opt.rect = r; | ||
1149 | //opt.showDecorationSelected = true; | ||
1150 | style()->drawPrimitive(QStyle::PE_PanelItemViewRow, &opt, &painter, this); | ||
1151 | if(selections->isSelected(index)) | ||
1152 | opt.state |= QStyle::State_Selected; | ||
1153 | if(currentIndex() == index) | ||
1154 | opt.state |= QStyle::State_HasFocus; | ||
1155 | if(m_hover == index) | ||
1156 | opt.state |= QStyle::State_MouseOver; | ||
1157 | itemDelegate(index)->paint(&painter, opt, index); | ||
1158 | // paint left/right lines | ||
1159 | painter.fillRect(QRect(r.left() - sep_sz, r.top(), sep_sz, r.height()), grid_brush); | ||
1160 | painter.fillRect(QRect(r.right() + 1, r.top(), sep_sz, r.height()), grid_brush); | ||
894 | } | 1161 | } |
895 | #undef ith_col_x | ||
896 | } | 1162 | } |
897 | 1163 | ||
898 | void RegSexyDisplay2::RecomputeGeometry() | 1164 | void YRegDisplay::recomputeGeometry() |
899 | { | 1165 | { |
900 | if(!m_is_dirty) | 1166 | if(!m_is_dirty) |
901 | return; | 1167 | return; |
902 | /* height: header + gap + sep + content + sep */ | 1168 | /* height: header + gap + sep + content + sep */ |
903 | m_minimum_height = 0; | 1169 | m_minimum_height = 0; |
904 | m_minimum_height += GetHeaderHeight() + GetGapHeight(); | 1170 | m_minimum_height += headerHeight() + gapHeight(); |
905 | m_minimum_height += 2 * GetSeparatorSize() + GetMaxContentHeight(); | 1171 | m_minimum_height += 2 * separatorSize() + maxContentHeight(); |
906 | /* width: sep + (col + sep) * n */ | 1172 | /* width: sep + (col + sep) * n */ |
907 | m_minimum_width = GetSeparatorSize() * 33 + GetColumnWidth() * 32; | 1173 | m_minimum_width = separatorSize() * (m_nr_bits + 1) + minColumnWidth() * m_nr_bits; |
908 | m_is_dirty = false; | 1174 | m_is_dirty = false; |
909 | viewport()->update(); | 1175 | viewport()->update(); |
910 | } | 1176 | } |
911 | 1177 | ||
912 | void RegSexyDisplay2::resizeEvent(QResizeEvent*) | 1178 | void YRegDisplay::resizeEvent(QResizeEvent*) |
913 | { | 1179 | { |
914 | m_is_dirty = true; | 1180 | m_is_dirty = true; |
915 | RecomputeGeometry(); | 1181 | recomputeGeometry(); |
916 | updateGeometries(); | 1182 | updateGeometries(); |
917 | } | 1183 | } |
918 | 1184 | ||
919 | void RegSexyDisplay2::updateGeometries() | 1185 | void YRegDisplay::updateGeometries() |
920 | { | 1186 | { |
921 | horizontalScrollBar()->setSingleStep(1); | 1187 | horizontalScrollBar()->setSingleStep(1); |
922 | horizontalScrollBar()->setPageStep(viewport()->width()); | 1188 | horizontalScrollBar()->setPageStep(viewport()->width()); |
@@ -926,6 +1192,35 @@ void RegSexyDisplay2::updateGeometries() | |||
926 | verticalScrollBar()->setRange(0, qMax(0, m_minimum_height - viewport()->height())); | 1192 | verticalScrollBar()->setRange(0, qMax(0, m_minimum_height - viewport()->height())); |
927 | } | 1193 | } |
928 | 1194 | ||
1195 | bool YRegDisplay::viewportEvent(QEvent *event) | ||
1196 | { | ||
1197 | /* FIXME Apparently QAbstractItemView tracks the hovered index but keeps it | ||
1198 | * in its private part which is not accessible, which makes it useless... | ||
1199 | * This code reimplements it */ | ||
1200 | switch (event->type()) | ||
1201 | { | ||
1202 | case QEvent::HoverEnter: | ||
1203 | m_hover = indexAt(static_cast<QHoverEvent*>(event)->pos()); | ||
1204 | update(m_hover); | ||
1205 | break; | ||
1206 | case QEvent::HoverLeave: | ||
1207 | update(m_hover); // update old | ||
1208 | m_hover = QModelIndex(); | ||
1209 | break; | ||
1210 | case QEvent::HoverMove: | ||
1211 | { | ||
1212 | QModelIndex old = m_hover; | ||
1213 | m_hover = indexAt(static_cast<QHoverEvent*>(event)->pos()); | ||
1214 | if(m_hover != old) | ||
1215 | viewport()->update(visualRect(old)|visualRect(m_hover)); | ||
1216 | break; | ||
1217 | } | ||
1218 | default: | ||
1219 | break; | ||
1220 | } | ||
1221 | return QAbstractItemView::viewportEvent(event); | ||
1222 | } | ||
1223 | |||
929 | /** | 1224 | /** |
930 | * GrowingTableView | 1225 | * GrowingTableView |
931 | */ | 1226 | */ |
@@ -966,6 +1261,12 @@ MyTextEditor::MyTextEditor(QWidget *parent) | |||
966 | QVBoxLayout *layout = new QVBoxLayout; | 1261 | QVBoxLayout *layout = new QVBoxLayout; |
967 | m_toolbar = new QToolBar(this); | 1262 | m_toolbar = new QToolBar(this); |
968 | m_edit = new QTextEdit(this); | 1263 | m_edit = new QTextEdit(this); |
1264 | #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) | ||
1265 | /* Qt 5.2 have a hardcoded sizeHint for QAbstractScrollArea which makes it | ||
1266 | * hard to have a good behaviour for the text editor. Fortunately 5.2 introduces | ||
1267 | * a new option to adjust this to the content. */ | ||
1268 | m_edit->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); | ||
1269 | #endif | ||
969 | layout->addWidget(m_toolbar, 0); | 1270 | layout->addWidget(m_toolbar, 0); |
970 | layout->addWidget(m_edit, 1); | 1271 | layout->addWidget(m_edit, 1); |
971 | setLayout(layout); | 1272 | setLayout(layout); |
@@ -1000,8 +1301,11 @@ MyTextEditor::MyTextEditor(QWidget *parent) | |||
1000 | connect(m_edit, SIGNAL(currentCharFormatChanged(const QTextCharFormat&)), | 1301 | connect(m_edit, SIGNAL(currentCharFormatChanged(const QTextCharFormat&)), |
1001 | this, SLOT(OnCharFormatChanged(const QTextCharFormat&))); | 1302 | this, SLOT(OnCharFormatChanged(const QTextCharFormat&))); |
1002 | 1303 | ||
1304 | m_edit->installEventFilter(this); | ||
1305 | |||
1003 | SetGrowingMode(false); | 1306 | SetGrowingMode(false); |
1004 | SetReadOnly(false); | 1307 | SetReadOnly(false); |
1308 | m_toolbar->hide(); | ||
1005 | } | 1309 | } |
1006 | 1310 | ||
1007 | void MyTextEditor::SetReadOnly(bool en) | 1311 | void MyTextEditor::SetReadOnly(bool en) |
@@ -1021,7 +1325,7 @@ void MyTextEditor::SetGrowingMode(bool en) | |||
1021 | { | 1325 | { |
1022 | m_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); | 1326 | m_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); |
1023 | m_edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | 1327 | m_edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
1024 | OnTextChanged(); | 1328 | OnInternalTextChanged(); |
1025 | } | 1329 | } |
1026 | else | 1330 | else |
1027 | { | 1331 | { |
@@ -1036,10 +1340,11 @@ void MyTextEditor::OnInternalTextChanged() | |||
1036 | { | 1340 | { |
1037 | int content_size = m_edit->document()->documentLayout()->documentSize().height(); | 1341 | int content_size = m_edit->document()->documentLayout()->documentSize().height(); |
1038 | content_size = qMax(content_size, m_edit->fontMetrics().height()); | 1342 | content_size = qMax(content_size, m_edit->fontMetrics().height()); |
1039 | m_edit->setMinimumHeight(content_size + m_edit->contentsMargins().top() + | 1343 | m_edit->setMinimumHeight(content_size + m_edit->contentsMargins().top() + |
1040 | m_edit->contentsMargins().bottom()); | 1344 | m_edit->contentsMargins().bottom()); |
1041 | } | 1345 | } |
1042 | emit OnTextChanged(); | 1346 | emit OnTextChanged(); |
1347 | emit OnTextChanged(GetTextHtml()); | ||
1043 | } | 1348 | } |
1044 | 1349 | ||
1045 | void MyTextEditor::OnTextBold(bool checked) | 1350 | void MyTextEditor::OnTextBold(bool checked) |
@@ -1094,6 +1399,19 @@ bool MyTextEditor::IsModified() | |||
1094 | return m_edit->document()->isModified(); | 1399 | return m_edit->document()->isModified(); |
1095 | } | 1400 | } |
1096 | 1401 | ||
1402 | bool MyTextEditor::eventFilter(QObject *object, QEvent *event) | ||
1403 | { | ||
1404 | if(object != m_edit) | ||
1405 | return false; | ||
1406 | if(m_read_only) | ||
1407 | return false; | ||
1408 | if(event->type() == QEvent::FocusIn) | ||
1409 | m_toolbar->show(); | ||
1410 | else if(event->type() == QEvent::FocusOut) | ||
1411 | m_toolbar->hide(); | ||
1412 | return false; | ||
1413 | } | ||
1414 | |||
1097 | /** | 1415 | /** |
1098 | * BackendSelector | 1416 | * BackendSelector |
1099 | */ | 1417 | */ |
@@ -1159,7 +1477,10 @@ void BackendSelector::OnDataSelChanged(int index) | |||
1159 | m_dev_selector->hide(); | 1477 | m_dev_selector->hide(); |
1160 | #endif | 1478 | #endif |
1161 | QFileDialog *fd = new QFileDialog(m_data_selector); | 1479 | QFileDialog *fd = new QFileDialog(m_data_selector); |
1162 | fd->setFilter("Textual files (*.txt);;All files (*)"); | 1480 | QStringList filters; |
1481 | filters << "Textual files (*.txt)"; | ||
1482 | filters << "All files (*)"; | ||
1483 | fd->setNameFilters(filters); | ||
1163 | fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); | 1484 | fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); |
1164 | if(fd->exec()) | 1485 | if(fd->exec()) |
1165 | { | 1486 | { |
@@ -1252,6 +1573,47 @@ void BackendSelector::ChangeBackend(IoBackend *new_backend) | |||
1252 | } | 1573 | } |
1253 | 1574 | ||
1254 | /** | 1575 | /** |
1576 | * YTabWidget | ||
1577 | */ | ||
1578 | YTabWidget::YTabWidget(QTabBar *bar, QWidget *parent) | ||
1579 | :QTabWidget(parent) | ||
1580 | { | ||
1581 | if(bar != 0) | ||
1582 | setTabBar(bar); | ||
1583 | m_tab_open_button = new QToolButton(this); | ||
1584 | m_tab_open_button->setIcon(QIcon::fromTheme("list-add")); | ||
1585 | m_tab_open_button->setAutoRaise(true); | ||
1586 | m_tab_open_button->setPopupMode(QToolButton::InstantPopup); | ||
1587 | /* the arrow with an icon only is pretty ugly and QToolButton has no way | ||
1588 | * to remove the arrow programmaticaly, so use the CSS to do that */ | ||
1589 | m_tab_open_button->setStyleSheet("QToolButton::menu-indicator { image: none; }"); | ||
1590 | setCornerWidget(m_tab_open_button, Qt::TopLeftCorner); | ||
1591 | setTabOpenable(false); | ||
1592 | connect(m_tab_open_button, SIGNAL(clicked(bool)), this, SLOT(OnOpenButton(bool))); | ||
1593 | /* there is a quirk in the default QStyle: if the tab bar is empty, it | ||
1594 | * returns the minimum size of the corner widget, which is 0 for tool buttons */ | ||
1595 | //setMinimumHeight(m_tab_open_button->height()); | ||
1596 | //m_tab_open_button->setMinimumHeight(m_tab_open_button->sizeHint().height()); | ||
1597 | } | ||
1598 | |||
1599 | void YTabWidget::setTabOpenable(bool openable) | ||
1600 | { | ||
1601 | m_tab_openable = openable; | ||
1602 | m_tab_open_button->setVisible(openable); | ||
1603 | } | ||
1604 | |||
1605 | void YTabWidget::OnOpenButton(bool checked) | ||
1606 | { | ||
1607 | Q_UNUSED(checked); | ||
1608 | emit tabOpenRequested(); | ||
1609 | } | ||
1610 | |||
1611 | void YTabWidget::setTabOpenMenu(QMenu *menu) | ||
1612 | { | ||
1613 | m_tab_open_button->setMenu(menu); | ||
1614 | } | ||
1615 | |||
1616 | /** | ||
1255 | * MessageWidget | 1617 | * MessageWidget |
1256 | */ | 1618 | */ |
1257 | MessageWidget::MessageWidget(QWidget *parent) | 1619 | MessageWidget::MessageWidget(QWidget *parent) |
@@ -1339,3 +1701,21 @@ void MessageWidget::OnClose(bool clicked) | |||
1339 | Q_UNUSED(clicked); | 1701 | Q_UNUSED(clicked); |
1340 | hide(); | 1702 | hide(); |
1341 | } | 1703 | } |
1704 | |||
1705 | /** | ||
1706 | * Misc | ||
1707 | */ | ||
1708 | |||
1709 | QGroupBox *Misc::EncloseInBox(const QString& name, QWidget *widget) | ||
1710 | { | ||
1711 | QVBoxLayout *layout = new QVBoxLayout; | ||
1712 | layout->addWidget(widget); | ||
1713 | return Misc::EncloseInBox(name, layout); | ||
1714 | } | ||
1715 | |||
1716 | QGroupBox *Misc::EncloseInBox(const QString& name, QLayout *layout) | ||
1717 | { | ||
1718 | QGroupBox *group = new QGroupBox(name); | ||
1719 | group->setLayout(layout); | ||
1720 | return group; | ||
1721 | } | ||
diff --git a/utils/regtools/qeditor/utils.h b/utils/regtools/qeditor/utils.h index f3dbd15a22..026466fae0 100644 --- a/utils/regtools/qeditor/utils.h +++ b/utils/regtools/qeditor/utils.h | |||
@@ -38,9 +38,22 @@ | |||
38 | #include <QComboBox> | 38 | #include <QComboBox> |
39 | #include <QFileDialog> | 39 | #include <QFileDialog> |
40 | #include <QScrollBar> | 40 | #include <QScrollBar> |
41 | #include <QGroupBox> | ||
42 | #include <QSortFilterProxyModel> | ||
41 | #include "settings.h" | 43 | #include "settings.h" |
42 | #include "backend.h" | 44 | #include "backend.h" |
43 | 45 | ||
46 | // FIXME see QTBUG-30392 | ||
47 | namespace | ||
48 | { | ||
49 | template< typename T > | ||
50 | inline bool isUserType(const QVariant& var) | ||
51 | { | ||
52 | return var.type() == QVariant::UserType && var.userType() == qMetaTypeId< T >(); | ||
53 | } | ||
54 | |||
55 | } | ||
56 | |||
44 | class SocBitRangeValidator : public QValidator | 57 | class SocBitRangeValidator : public QValidator |
45 | { | 58 | { |
46 | Q_OBJECT | 59 | Q_OBJECT |
@@ -51,6 +64,13 @@ public: | |||
51 | virtual State validate(QString& input, int& pos) const; | 64 | virtual State validate(QString& input, int& pos) const; |
52 | /* validate and return the interpreted value */ | 65 | /* validate and return the interpreted value */ |
53 | State parse(const QString& input, int& last_bit, int& first_bit) const; | 66 | State parse(const QString& input, int& last_bit, int& first_bit) const; |
67 | /* create a valid string from range */ | ||
68 | QString generate(int last_bit, int first_bit) const; | ||
69 | /* set maximum width in bits */ | ||
70 | void setWidth(int nr_bits); | ||
71 | |||
72 | protected: | ||
73 | int m_width; | ||
54 | }; | 74 | }; |
55 | 75 | ||
56 | class SocFieldValidator : public QValidator | 76 | class SocFieldValidator : public QValidator |
@@ -58,7 +78,7 @@ class SocFieldValidator : public QValidator | |||
58 | Q_OBJECT | 78 | Q_OBJECT |
59 | public: | 79 | public: |
60 | SocFieldValidator(QObject *parent = 0); | 80 | SocFieldValidator(QObject *parent = 0); |
61 | SocFieldValidator(const soc_reg_field_t& field, QObject *parent = 0); | 81 | SocFieldValidator(const soc_desc::field_t& field, QObject *parent = 0); |
62 | 82 | ||
63 | virtual void fixup(QString& input) const; | 83 | virtual void fixup(QString& input) const; |
64 | virtual State validate(QString& input, int& pos) const; | 84 | virtual State validate(QString& input, int& pos) const; |
@@ -66,7 +86,7 @@ public: | |||
66 | State parse(const QString& input, soc_word_t& val) const; | 86 | State parse(const QString& input, soc_word_t& val) const; |
67 | 87 | ||
68 | protected: | 88 | protected: |
69 | soc_reg_field_t m_field; | 89 | soc_desc::field_t m_field; |
70 | }; | 90 | }; |
71 | 91 | ||
72 | class RegLineEdit : public QWidget | 92 | class RegLineEdit : public QWidget |
@@ -112,10 +132,11 @@ class SocFieldItemDelegate : public QStyledItemDelegate | |||
112 | { | 132 | { |
113 | public: | 133 | public: |
114 | SocFieldItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent), m_bitcount(32) {} | 134 | SocFieldItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent), m_bitcount(32) {} |
115 | SocFieldItemDelegate(const soc_reg_field_t& field, QObject *parent = 0) | 135 | SocFieldItemDelegate(const soc_desc::field_t& field, QObject *parent = 0) |
116 | :QStyledItemDelegate(parent), m_bitcount(field.last_bit - field.first_bit + 1) {} | 136 | :QStyledItemDelegate(parent), m_bitcount(field.width) {} |
117 | 137 | ||
118 | virtual QString displayText(const QVariant& value, const QLocale& locale) const; | 138 | virtual QString displayText(const QVariant& value, const QLocale& locale) const; |
139 | void setWidth(int bitcount); | ||
119 | protected: | 140 | protected: |
120 | int m_bitcount; | 141 | int m_bitcount; |
121 | }; | 142 | }; |
@@ -125,44 +146,54 @@ class SocFieldEditor : public QLineEdit | |||
125 | Q_OBJECT | 146 | Q_OBJECT |
126 | Q_PROPERTY(uint field READ field WRITE setField USER true) | 147 | Q_PROPERTY(uint field READ field WRITE setField USER true) |
127 | public: | 148 | public: |
128 | SocFieldEditor(const soc_reg_field_t& field, QWidget *parent = 0); | 149 | SocFieldEditor(const soc_desc::field_t& field, QWidget *parent = 0); |
129 | virtual ~SocFieldEditor(); | 150 | virtual ~SocFieldEditor(); |
130 | 151 | ||
131 | uint field() const; | 152 | uint field() const; |
132 | void setField(uint field); | 153 | void setField(uint field); |
133 | void SetRegField(const soc_reg_field_t& field); | 154 | void SetRegField(const soc_desc::field_t& field); |
155 | |||
156 | signals: | ||
157 | void editingFinished(uint value); | ||
158 | |||
159 | protected slots: | ||
160 | void editDone(); | ||
134 | 161 | ||
135 | protected: | 162 | protected: |
136 | SocFieldValidator *m_validator; | 163 | SocFieldValidator *m_validator; |
137 | uint m_field; | 164 | uint m_field; |
138 | soc_reg_field_t m_reg_field; | 165 | soc_desc::field_t m_reg_field; |
139 | }; | 166 | }; |
140 | 167 | ||
141 | class SocFieldEditorCreator : public QItemEditorCreatorBase | 168 | class SocFieldEditorCreator : public QItemEditorCreatorBase |
142 | { | 169 | { |
143 | public: | 170 | public: |
144 | SocFieldEditorCreator() { m_field.first_bit = 0; m_field.last_bit = 31; } | 171 | SocFieldEditorCreator() { m_field.pos = 0; m_field.width = 32; } |
145 | SocFieldEditorCreator(const soc_reg_field_t& field):m_field(field) {} | 172 | SocFieldEditorCreator(const soc_desc::field_t& field):m_field(field) {} |
146 | 173 | ||
147 | virtual QWidget *createWidget(QWidget *parent) const; | 174 | virtual QWidget *createWidget(QWidget *parent) const; |
148 | virtual QByteArray valuePropertyName() const; | 175 | virtual QByteArray valuePropertyName() const; |
149 | 176 | ||
177 | void setWidth(int bitcount); | ||
178 | |||
150 | protected: | 179 | protected: |
151 | soc_reg_field_t m_field; | 180 | soc_desc::field_t m_field; |
152 | }; | 181 | }; |
153 | 182 | ||
154 | class SocFieldCachedValue | 183 | class SocFieldCachedValue |
155 | { | 184 | { |
156 | public: | 185 | public: |
157 | SocFieldCachedValue():m_value(0) {} | 186 | SocFieldCachedValue():m_value(0) {} |
158 | SocFieldCachedValue(const soc_reg_field_t& field, uint value); | 187 | SocFieldCachedValue(const soc_desc::field_t& field, uint value); |
159 | virtual ~SocFieldCachedValue() {} | 188 | virtual ~SocFieldCachedValue() {} |
160 | const soc_reg_field_t& field() const { return m_field; } | 189 | const soc_desc::field_t& field() const { return m_field; } |
161 | uint value() const { return m_value; } | 190 | uint value() const { return m_value; } |
162 | /* return empty string if there no match */ | 191 | /* return empty string if there no match */ |
163 | QString value_name() const { return m_name; } | 192 | QString value_name() const { return m_name; } |
193 | |||
194 | bool operator<(const SocFieldCachedValue& o) const; | ||
164 | protected: | 195 | protected: |
165 | soc_reg_field_t m_field; | 196 | soc_desc::field_t m_field; |
166 | uint m_value; | 197 | uint m_value; |
167 | QString m_name; | 198 | QString m_name; |
168 | }; | 199 | }; |
@@ -172,11 +203,14 @@ Q_DECLARE_METATYPE(SocFieldCachedValue) | |||
172 | class SocFieldBitRange | 203 | class SocFieldBitRange |
173 | { | 204 | { |
174 | public: | 205 | public: |
175 | SocFieldBitRange():m_first_bit(0),m_last_bit(0) {} | 206 | SocFieldBitRange():m_first_bit(0), m_last_bit(0) {} |
176 | SocFieldBitRange(const soc_reg_field_t& field) | 207 | SocFieldBitRange(const soc_desc::field_t& field) |
177 | :m_first_bit(field.first_bit), m_last_bit(field.last_bit) {} | 208 | :m_first_bit(field.pos), m_last_bit(field.pos + field.width - 1) {} |
209 | SocFieldBitRange(int first, int last):m_first_bit(first), m_last_bit(last) {} | ||
178 | unsigned GetFirstBit() const { return m_first_bit; } | 210 | unsigned GetFirstBit() const { return m_first_bit; } |
179 | unsigned GetLastBit() const { return m_last_bit; } | 211 | unsigned GetLastBit() const { return m_last_bit; } |
212 | |||
213 | bool operator<(const SocFieldBitRange& o) const; | ||
180 | protected: | 214 | protected: |
181 | unsigned m_first_bit, m_last_bit; | 215 | unsigned m_first_bit, m_last_bit; |
182 | }; | 216 | }; |
@@ -248,14 +282,16 @@ class RegFieldTableModel : public QAbstractTableModel | |||
248 | Q_OBJECT | 282 | Q_OBJECT |
249 | public: | 283 | public: |
250 | RegFieldTableModel(QObject *parent); | 284 | RegFieldTableModel(QObject *parent); |
251 | virtual int rowCount(const QModelIndex & parent = QModelIndex()) const; | 285 | virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; |
252 | virtual int columnCount(const QModelIndex & parent = QModelIndex()) const; | 286 | virtual int columnCount(const QModelIndex& parent = QModelIndex()) const; |
253 | virtual QVariant data(const QModelIndex & index, int role) const; | 287 | virtual QVariant data(const QModelIndex& index, int role) const; |
254 | virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; | 288 | virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; |
255 | virtual Qt::ItemFlags flags (const QModelIndex & index) const; | 289 | virtual Qt::ItemFlags flags(const QModelIndex& index) const; |
256 | virtual bool setData(const QModelIndex& index, const QVariant& value, int role); | 290 | virtual bool setData(const QModelIndex& index, const QVariant& value, int role); |
257 | 291 | ||
258 | void SetRegister(const soc_reg_t& reg); | 292 | void SetRegister(const soc_desc::register_t& reg); |
293 | void UpdateRegister(const soc_desc::register_t& reg); | ||
294 | soc_desc::register_t GetRegister() const; | ||
259 | /* values can either be an invalid QVariant() (means no value/error), or a | 295 | /* values can either be an invalid QVariant() (means no value/error), or a |
260 | * QVariant containing a soc_word_t */ | 296 | * QVariant containing a soc_word_t */ |
261 | void SetValues(const QVector< QVariant >& values); | 297 | void SetValues(const QVector< QVariant >& values); |
@@ -286,22 +322,44 @@ protected: | |||
286 | Error | 322 | Error |
287 | }; | 323 | }; |
288 | 324 | ||
289 | soc_reg_t m_reg; | 325 | soc_desc::register_t m_reg; |
290 | QVector< QVariant > m_value; | 326 | QVector< QVariant > m_value; |
291 | QVector< ColorStatus > m_status; | 327 | QVector< ColorStatus > m_status; |
292 | RegTheme m_theme; | 328 | RegTheme m_theme; |
293 | bool m_read_only; | 329 | bool m_read_only; |
294 | }; | 330 | }; |
295 | 331 | ||
296 | class RegSexyDisplay2 : public QAbstractItemView | 332 | class RegFieldProxyModel : public QSortFilterProxyModel |
333 | { | ||
334 | public: | ||
335 | RegFieldProxyModel(QObject *parent):QSortFilterProxyModel(parent) {} | ||
336 | protected: | ||
337 | bool lessThan(const QModelIndex& left, const QModelIndex& right) const; | ||
338 | }; | ||
339 | |||
340 | class YRegDisplayItemDelegate : public QStyledItemDelegate | ||
341 | { | ||
342 | public: | ||
343 | YRegDisplayItemDelegate(QObject *parent = 0); | ||
344 | virtual void paint(QPainter * painter, const QStyleOptionViewItem& option, | ||
345 | const QModelIndex & index) const; | ||
346 | virtual QSize sizeHint(const QStyleOptionViewItem& option, | ||
347 | const QModelIndex & index) const; | ||
348 | }; | ||
349 | |||
350 | class YRegDisplay : public QAbstractItemView | ||
297 | { | 351 | { |
298 | Q_OBJECT | 352 | Q_OBJECT |
299 | public: | 353 | public: |
300 | RegSexyDisplay2(QWidget *parent = 0); | 354 | YRegDisplay(QWidget *parent = 0); |
301 | virtual QModelIndex indexAt(const QPoint& point) const; | 355 | virtual QModelIndex indexAt(const QPoint& point) const; |
302 | virtual void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible); | 356 | virtual void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible); |
303 | virtual QRect visualRect(const QModelIndex& index ) const; | 357 | virtual QRect visualRect(const QModelIndex& index) const; |
304 | virtual void setModel(QAbstractItemModel *model); | 358 | virtual void setModel(QAbstractItemModel *model); |
359 | /* specify the number of bits to display */ | ||
360 | void setWidth(int nr_bits); | ||
361 | /* returns the bit column at a point, or -1 if none except if closest=true */ | ||
362 | int bitColumnAt(const QPoint& point, bool closest = true) const; | ||
305 | 363 | ||
306 | protected slots: | 364 | protected slots: |
307 | virtual void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); | 365 | virtual void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); |
@@ -311,14 +369,20 @@ protected slots: | |||
311 | virtual void updateGeometries(); | 369 | virtual void updateGeometries(); |
312 | 370 | ||
313 | protected: | 371 | protected: |
314 | int GetMarginSize() const; // margin in cells | 372 | int marginSize() const; // margin in cells |
315 | int GetSeparatorSize() const; // size of lines betweens cells | 373 | int separatorSize() const; // size of lines betweens cells |
316 | int GetColumnWidth() const; // width of a 1-bit column (excluding separators) | 374 | int minColumnWidth() const; // minimum width of a column (excluding separators) |
317 | int GetHeaderHeight() const; // height of the header (excluding separators) | 375 | int maxColumnWidth() const; // maximum width of a column (excluding separators) |
318 | int GetGapHeight() const; // height of gap between header and fields | 376 | int columnWidth(int col) const; // width of a 1-bit column (excluding separators) |
319 | int GetMaxContentHeight() const; // maximum height of field columns | 377 | int headerHeight() const; // height of the header (excluding separators) |
320 | int GetHeaderTextSep() const; // height between digits in header | 378 | int gapHeight() const; // height of gap between header and fields |
321 | void RecomputeGeometry(); | 379 | int maxContentHeight() const; // maximum height of field columns |
380 | int headerTextSep() const; // height between digits in header | ||
381 | int columnOffset(int col) const; // column offset | ||
382 | int bitToColumn(int bit) const; // bit -> column | ||
383 | void recomputeGeometry(); | ||
384 | QRect itemRect(const SocFieldBitRange& range, int col) const; | ||
385 | QRect itemRect(const QModelIndex& index) const; | ||
322 | 386 | ||
323 | virtual bool isIndexHidden(const QModelIndex& index) const; | 387 | virtual bool isIndexHidden(const QModelIndex& index) const; |
324 | virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers); | 388 | virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers); |
@@ -328,9 +392,13 @@ protected: | |||
328 | virtual QRegion visualRegionForSelection(const QItemSelection& selection) const; | 392 | virtual QRegion visualRegionForSelection(const QItemSelection& selection) const; |
329 | virtual void paintEvent(QPaintEvent *event); | 393 | virtual void paintEvent(QPaintEvent *event); |
330 | virtual void resizeEvent(QResizeEvent* event); | 394 | virtual void resizeEvent(QResizeEvent* event); |
395 | virtual bool viewportEvent(QEvent * event); | ||
331 | 396 | ||
332 | bool m_is_dirty; | 397 | bool m_is_dirty; |
333 | int m_minimum_width, m_minimum_height; | 398 | int m_minimum_width, m_minimum_height; |
399 | int m_range_col, m_data_col; | ||
400 | int m_nr_bits; | ||
401 | QModelIndex m_hover; | ||
334 | }; | 402 | }; |
335 | 403 | ||
336 | /** | 404 | /** |
@@ -387,8 +455,10 @@ public: | |||
387 | void SetTextHtml(const QString& text); | 455 | void SetTextHtml(const QString& text); |
388 | QString GetTextHtml(); | 456 | QString GetTextHtml(); |
389 | bool IsModified(); | 457 | bool IsModified(); |
458 | |||
390 | signals: | 459 | signals: |
391 | void OnTextChanged(); | 460 | void OnTextChanged(); |
461 | void OnTextChanged(const QString& text_html); | ||
392 | 462 | ||
393 | protected slots: | 463 | protected slots: |
394 | void OnInternalTextChanged(); | 464 | void OnInternalTextChanged(); |
@@ -398,6 +468,8 @@ protected slots: | |||
398 | void OnCharFormatChanged(const QTextCharFormat& fmt); | 468 | void OnCharFormatChanged(const QTextCharFormat& fmt); |
399 | 469 | ||
400 | protected: | 470 | protected: |
471 | virtual bool eventFilter(QObject *object, QEvent *event); | ||
472 | |||
401 | bool m_growing_mode; | 473 | bool m_growing_mode; |
402 | bool m_read_only; | 474 | bool m_read_only; |
403 | QToolBar *m_toolbar; | 475 | QToolBar *m_toolbar; |
@@ -483,4 +555,35 @@ private slots: | |||
483 | void OnClose(bool clicked); | 555 | void OnClose(bool clicked); |
484 | }; | 556 | }; |
485 | 557 | ||
558 | Q_DECLARE_METATYPE(QModelIndex) | ||
559 | |||
560 | class YTabWidget : public QTabWidget | ||
561 | { | ||
562 | Q_OBJECT | ||
563 | Q_PROPERTY(bool tabOpenable READ tabOpenable WRITE setTabOpenable) | ||
564 | public: | ||
565 | YTabWidget(QTabBar *tabbar = 0, QWidget *parent = 0); | ||
566 | |||
567 | inline bool tabOpenable() const { return m_tab_openable; } | ||
568 | void setTabOpenable(bool openable); | ||
569 | void setTabOpenMenu(QMenu *menu); | ||
570 | |||
571 | signals: | ||
572 | void tabOpenRequested(); | ||
573 | |||
574 | protected slots: | ||
575 | void OnOpenButton(bool checked); | ||
576 | |||
577 | protected: | ||
578 | bool m_tab_openable; | ||
579 | QToolButton *m_tab_open_button; | ||
580 | }; | ||
581 | |||
582 | class Misc | ||
583 | { | ||
584 | public: | ||
585 | static QGroupBox *EncloseInBox(const QString& name, QWidget *widget); | ||
586 | static QGroupBox *EncloseInBox(const QString& name, QLayout *layout); | ||
587 | }; | ||
588 | |||
486 | #endif /* AUX_H */ | 589 | #endif /* AUX_H */ |