summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2016-02-06 15:08:43 +0000
committerAmaury Pouly <amaury.pouly@gmail.com>2016-02-06 15:20:48 +0000
commit6b9610fb908b27d1e0383c8d9bde3a88f35ed30c (patch)
tree1b0f5e2821b44d20f3704c584e309f5911357040 /utils/regtools/qeditor
parent0f701a64bee43e79f95970ae9c0ec43ea7fcdf17 (diff)
downloadrockbox-6b9610fb908b27d1e0383c8d9bde3a88f35ed30c.tar.gz
rockbox-6b9610fb908b27d1e0383c8d9bde3a88f35ed30c.zip
regtoosl/qeditor: port to the new description format
This big commit port qeditor from v1 to v2 register file format. Although the display code was much simplified, the edit code had to be rewritten. The new code also brings many improvement to the register display widget. The new code also compiles with both Qt4 and Qt5, although it is recommended to use Qt5 to get some improvements, especially in the layout of editor. Change-Id: I24633ac37a144f25d9e705b565654269ec9cfbd3
Diffstat (limited to 'utils/regtools/qeditor')
-rw-r--r--utils/regtools/qeditor/analyser.cpp2
-rw-r--r--utils/regtools/qeditor/analyser.h10
-rw-r--r--utils/regtools/qeditor/backend.cpp422
-rw-r--r--utils/regtools/qeditor/backend.h208
-rw-r--r--utils/regtools/qeditor/main.cpp12
-rw-r--r--utils/regtools/qeditor/mainwindow.cpp27
-rw-r--r--utils/regtools/qeditor/mainwindow.h13
-rw-r--r--utils/regtools/qeditor/qeditor.pro2
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.cpp157
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.h36
-rw-r--r--utils/regtools/qeditor/regedit.cpp2222
-rw-r--r--utils/regtools/qeditor/regedit.h276
-rw-r--r--utils/regtools/qeditor/regtab.cpp152
-rw-r--r--utils/regtools/qeditor/regtab.h13
-rw-r--r--utils/regtools/qeditor/std_analysers.cpp429
-rw-r--r--utils/regtools/qeditor/std_analysers.h26
-rw-r--r--utils/regtools/qeditor/utils.cpp644
-rw-r--r--utils/regtools/qeditor/utils.h169
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
23Analyser::Analyser(const SocRef& soc, IoBackend *backend) 23Analyser::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 @@
30class Analyser : public RegTabPanel 30class Analyser : public RegTabPanel
31{ 31{
32public: 32public:
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
38protected: 38protected:
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;
53private: 53private:
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 */
30SocFile::SocFile() 30SocFile::SocFile()
31 :m_valid(false) 31 :m_valid(true)
32{ 32{
33} 33}
34 34
35SocFile::SocFile(const QString& filename) 35SocFile::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
42bool SocFile::IsValid() 42bool SocFile::IsValid()
@@ -44,9 +44,12 @@ bool SocFile::IsValid()
44 return m_valid; 44 return m_valid;
45} 45}
46 46
47SocRef SocFile::GetSocRef() 47soc_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
52QString SocFile::GetFilename() 55QString 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
74QList< SocRef > Backend::GetSocList() 80QList< 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
123DummyIoBackend::DummyIoBackend()
124{
125}
126
127bool DummyIoBackend::IsValid()
128{
129 return false;
130}
131
132QString DummyIoBackend::GetSocName()
133{
134 return "";
135}
136
137bool 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
146bool DummyIoBackend::Reload()
147{
148 return false;
149}
150
151bool DummyIoBackend::IsReadOnly()
152{
153 return true;
154}
155
156bool 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
166bool DummyIoBackend::IsDirty()
167{
168 return false;
169}
170
171bool DummyIoBackend::Commit()
172{
173 return false;
174}
175
176/**
110 * RamIoBackend 177 * RamIoBackend
111 */ 178 */
112RamIoBackend::RamIoBackend(const QString& soc_name) 179RamIoBackend::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
117bool RamIoBackend::ReadRegister(const QString& name, soc_word_t& value) 184bool RamIoBackend::IsValid()
185{
186 return m_soc != "";
187}
188
189QString RamIoBackend::GetSocName()
190{
191 return m_soc;
192}
193
194void RamIoBackend::SetSocName(const QString& soc_name)
195{
196 m_soc = soc_name;
197}
198
199bool RamIoBackend::RamIoBackend::Reload()
118{ 200{
119 QMap<QString, soc_word_t>::const_iterator it = m_map.find(name); 201 return false;
202}
203
204bool RamIoBackend::IsReadOnly()
205{
206 return false;
207}
208
209bool 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
131bool RamIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) 225bool 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
239bool RamIoBackend::IsDirty()
240{
241 return false;
242}
143 243
244bool 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
261bool FileIoBackend::IsValid()
262{
263 return m_valid;
264}
157 265
158bool FileIoBackend::Reload() 266bool 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
188bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) 297bool 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
194bool FileIoBackend::Commit() 304bool 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
323bool FileIoBackend::IsReadOnly()
324{
325 return m_readonly;
326}
327
328bool FileIoBackend::IsDirty()
329{
330 return m_dirty;
331}
332
333QString 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
372bool HWStubIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value) 499bool HWStubIoBackend::IsValid()
500{
501 return m_dev->IsValid();
502}
503
504bool HWStubIoBackend::IsReadOnly()
505{
506 return false;
507}
508
509bool HWStubIoBackend::IsDirty()
373{ 510{
374 return m_dev->ReadMem(addr, sizeof(value), &value); 511 return false;
375} 512}
376 513
377bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) 514bool HWStubIoBackend::Commit()
378{ 515{
516 return true;
517}
518
519HWStubDevice *HWStubIoBackend::GetDevice()
520{
521 return m_dev;
522}
523
524bool 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
532bool 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
389bool HWStubIoBackend::Reload() 547bool HWStubIoBackend::Reload()
@@ -486,146 +644,146 @@ lib_usb_init __lib_usb_init;
486 * BackendHelper 644 * BackendHelper
487 */ 645 */
488 646
489BackendHelper::BackendHelper(IoBackend *io_backend, const SocRef& soc) 647BackendHelper::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
494bool BackendHelper::ReadRegister(const QString& dev, const QString& reg, soc_word_t& v) 652QString 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
507bool 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
521bool BackendHelper::GetDevRef(const QString& sdev, SocDevRef& ref) 665soc_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
536bool BackendHelper::GetRegRef(const SocDevRef& dev, const QString& sreg, SocRegRef& ref) 707bool 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
554bool BackendHelper::GetFieldRef(const SocRegRef& reg, const QString& sfield, SocFieldRef& ref) 716bool 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
565bool BackendHelper::GetRegisterAddress(const QString& dev, const QString& reg, 725bool 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
576bool BackendHelper::ReadRegisterField(const QString& dev, const QString& reg, 734bool 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
591bool BackendHelper::DumpAllRegisters(const QString& filename, bool ignore_errors) 746bool 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
598bool BackendHelper::DumpAllRegisters(IoBackend *backend, bool ignore_errors) 753bool 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
759bool 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 */
36using namespace soc_desc_v1; 37using soc_desc::soc_word_t;
38using soc_desc::soc_addr_t;
39using soc_desc::soc_id_t;
37 40
38class IoBackend : public QObject 41class 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
89public: 77public:
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
114public: 96public:
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
134protected: 112protected:
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
144public: 122public:
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
156protected: 134protected:
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
222protected: 196protected:
223 QString m_soc; 197 QString m_soc;
@@ -251,8 +225,6 @@ protected:
251}; 225};
252#endif 226#endif
253 227
254class SocRef;
255
256class SocFile 228class SocFile
257{ 229{
258public: 230public:
@@ -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
267protected: 239protected:
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
273class SocFileRef 245class SocFileRef
@@ -283,56 +255,17 @@ protected:
283 255
284Q_DECLARE_METATYPE(SocFileRef) 256Q_DECLARE_METATYPE(SocFileRef)
285 257
286class SocRef : public SocFileRef 258Q_DECLARE_METATYPE(soc_desc::instance_t::type_t)
287{ 259Q_DECLARE_METATYPE(soc_desc::range_t::type_t)
288public:
289 SocRef() {}
290 SocRef(SocFile *file):SocFileRef(file) {}
291 soc_t& GetSoc() const { return GetSocFile()->GetSoc(); }
292};
293
294Q_DECLARE_METATYPE(SocRef)
295 260
296class SocDevRef : public SocRef 261Q_DECLARE_METATYPE(soc_desc::soc_ref_t)
297{ 262Q_DECLARE_METATYPE(soc_desc::node_ref_t)
298public: 263Q_DECLARE_METATYPE(soc_desc::register_ref_t)
299 SocDevRef() {} 264Q_DECLARE_METATYPE(soc_desc::field_ref_t)
300 SocDevRef(const SocRef& soc, int dev_idx, int dev_addr_idx) 265Q_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()]; }
306protected:
307 int m_dev_idx, m_dev_addr_idx;
308};
309
310class SocRegRef : public SocDevRef
311{
312public:
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()]; }
320protected:
321 int m_reg_idx, m_reg_addr_idx;
322};
323
324class SocFieldRef : public SocRegRef
325{
326public:
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()]; }
332protected:
333 int m_field_idx;
334};
335 266
267/** NOTE the Backend stores soc descriptions in a way that pointers are never
268 * invalidated */
336class Backend : public QObject 269class 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
351signals: 284signals:
352 void OnSocListChanged(); 285 void OnSocAdded(const SocFileRef& ref);
286
353private: 287private:
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
357class BackendHelper 292class BackendHelper
358{ 293{
359public: 294public:
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
310protected:
311 bool DumpAllRegisters(BackendHelper *bh, const soc_desc::node_inst_t& inst,
312 bool ignore_errors);
313
376private: 314private:
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
25int main(int argc, char *argv[]) 26int 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
46void DocumentTab::SetTabWidget(MyTabWidget *tab) 46void 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
63MyTabWidget::MyTabWidget() 63DocumentTabWidget::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
70void MyTabWidget::SetTabModified(DocumentTab *doc, bool modified) 70void 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
79void MyTabWidget::SetTabName(DocumentTab *doc, const QString& name) 79void 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
84bool MyTabWidget::CloseTab(int index) 84bool 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
98void MyTabWidget::OnCloseTab(int index) 98void 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
162void MainWindow::OnAbout() 164void 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)
193void MainWindow::OnLoadDesc() 195void 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
30class MyTabWidget; 31class DocumentTabWidget;
31 32
32class DocumentTab 33class 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
40protected: 41protected:
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
47class MyTabWidget : public QTabWidget 48class DocumentTabWidget : public YTabWidget
48{ 49{
49 Q_OBJECT 50 Q_OBJECT
50public: 51public:
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
85private: 86private:
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
12QMAKE_EXTRA_TARGETS += libsocdesc 12QMAKE_EXTRA_TARGETS += libsocdesc
13PRE_TARGETDEPS += libsocdesc 13PRE_TARGETDEPS += libsocdesc
14 14
15VERSION = 2.1.0 15VERSION = 3.0.0
16 16
17DEFINES += APP_VERSION=\\\"$$VERSION\\\" 17DEFINES += 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
29QWidget *RegItemEditorCreator::createWidget(QWidget * parent) const
30{
31 return new RegLineEdit(parent);
32}
33
34QByteArray RegItemEditorCreator::valuePropertyName () const
35{
36 return QByteArray("text");
37}
38 25
39/** 26/**
40 * SocDisplayPanel 27 * SocDisplayPanel
41 */ 28 */
42SocDisplayPanel::SocDisplayPanel(QWidget *parent, const SocRef& dev_ref) 29SocDisplayPanel::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 */
76DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref) 66NodeDisplayPanel::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
117void DevDisplayPanel::AllowWrite(bool en) 115void NodeDisplayPanel::AllowWrite(bool en)
118{ 116{
119 Q_UNUSED(en); 117 Q_UNUSED(en);
120} 118}
121 119
122QWidget *DevDisplayPanel::GetWidget() 120QWidget *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
131RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg_ref) 129RegDisplayPanel::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
259RegDisplayPanel::~RegDisplayPanel() 277RegDisplayPanel::~RegDisplayPanel()
@@ -263,12 +281,9 @@ RegDisplayPanel::~RegDisplayPanel()
263 281
264void RegDisplayPanel::Reload() 282void 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
302IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) 316IoBackend::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
354void RegDisplayPanel::OnRegFieldActivated(const QModelIndex& index)
355{
356 Q_UNUSED(index);
357}
358
342QWidget *RegDisplayPanel::GetWidget() 359QWidget *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
38class RegItemEditorCreator : public QItemEditorCreatorBase
39{
40public:
41 RegItemEditorCreator() {}
42 virtual QWidget *createWidget(QWidget * parent) const;
43 virtual QByteArray valuePropertyName () const;
44};
45
46class SocDisplayPanel : public QGroupBox, public RegTabPanel 38class SocDisplayPanel : public QGroupBox, public RegTabPanel
47{ 39{
48 Q_OBJECT 40 Q_OBJECT
49public: 41public:
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
56protected: 49protected:
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
63class DevDisplayPanel : public QGroupBox, public RegTabPanel 56class NodeDisplayPanel : public QGroupBox, public RegTabPanel
64{ 57{
65 Q_OBJECT 58 Q_OBJECT
66public: 59public:
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
73protected: 67protected:
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
81class RegDisplayPanel : public QGroupBox, public RegTabPanel 75class RegDisplayPanel : public QGroupBox, public RegTabPanel
82{ 76{
83 Q_OBJECT 77 Q_OBJECT
84public: 78public:
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:
120private slots: 117private 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 */
39SocEditPanel::SocEditPanel(SocRef ref, QWidget *parent) 40
41namespace
42{
43
44template< typename T >
45void my_remove_at(std::vector< T >& v, size_t at)
46{
47 v.erase(v.begin() + at);
48}
49
50enum
51{
52 SocEditPanelDelType = QTableWidgetItem::UserType,
53 SocEditPanelAddType,
54};
55
56}
57
58SocEditPanel::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
67void SocEditPanel::OnNameEdited(const QString& text) 146void 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
73void SocEditPanel::OnTextEdited() 152void 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/** 158void SocEditPanel::OnVersionEdited(const QString& text)
80 * DevEditPanel
81 */
82DevEditPanel::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); 164void 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
163void DevEditPanel::OnNameEdited(const QString& text) 170void 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
169void DevEditPanel::OnLongNameEdited(const QString& text) 176void 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
175void DevEditPanel::OnVersionEdited(const QString& text) 200void 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
181void DevEditPanel::OnDescEdited() 209/**
210 * NodeInstanceEditPanel
211 */
212
213namespace
182{ 214{
183 m_ref.GetDev().desc = m_desc_edit->GetTextHtml().toStdString(); 215
184 OnModified(m_desc_edit->IsModified()); 216template< typename T >
217soc_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
187void DevEditPanel::CreateNewRow(int row) 225template< typename T >
226int 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
204void DevEditPanel::FillRow(int row, const soc_dev_addr_t& addr) 234soc_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
220void DevEditPanel::OnInstActivated(int row, int column) 243bool 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
242void DevEditPanel::OnInstChanged(int row, int column) 255enum
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
263enum
264{
265 NodeInstEditPanelDelType = QTableWidgetItem::UserType,
266 NodeInstEditPanelAddType
267};
268
269}
270
271NodeInstanceEditPanel::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/** 455soc_desc::instance_t& NodeInstanceEditPanel::GetInstance()
261 * RegEditPanel 456{
262 */ 457 return *GetInstanceById(m_ref, m_id);
458}
263 459
264RegEditPanel::RegEditPanel(SocRegRef ref, QWidget *parent) 460void 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); 466void 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; 472void 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; 478void 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(); 484void NodeInstanceEditPanel::OnBaseChanged(uint base)
485{
486 GetInstance().range.base = base;
487 OnModified();
488}
369 489
370 setLayout(layout); 490void NodeInstanceEditPanel::OnStrideChanged(uint stride)
491{
492 GetInstance().range.stride = stride;
493 OnModified();
494}
371 495
372 SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(this); 496void 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))); 502void 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
390void RegEditPanel::UpdateWarning(int row) 508void NodeInstanceEditPanel::OnFormulaChanged(const QString& formula)
391{ 509{
392 Q_UNUSED(row); 510 GetInstance().range.formula = formula.toStdString();
511 OnModified();
393} 512}
394 513
395void RegEditPanel::OnFormulaStringChanged(const QString& text) 514void 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
401void RegEditPanel::OnFormulaGenerate(bool checked) 520void 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
448void RegEditPanel::OnFormulaChanged(int index) 548void 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
457void RegEditPanel::UpdateFormula() 559void 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
473void RegEditPanel::OnSctEdited(int state) 597void 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
482void 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
498void 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
515void RegEditPanel::OnNameEdited(const QString& text) 605soc_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
521void 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
527void RegEditPanel::OnInstActivated(int row, int column) 614NodeEditPanel::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
549void RegEditPanel::OnInstChanged(int row, int column) 670void 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) 676void 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
682void NodeEditPanel::OnDescEdited()
683{
684 m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString();
685 OnModified();
686}
687
688void 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
698void 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
707QString 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
746void 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 */
570FieldEditPanel::FieldEditPanel(SocFieldRef ref, QWidget *parent) 769
770namespace
771{
772
773enum
774{
775 RegFieldEditPanelDelType = QTableWidgetItem::UserType,
776 RegFieldEditPanelAddType,
777};
778
779}
780
781RegFieldEditPanel::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
639void FieldEditPanel::UpdateDelegates() 873void 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
650void FieldEditPanel::UpdateWarning(int row) 878void 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
667void FieldEditPanel::FillRow(int row, const soc_reg_field_value_t& val) 912void 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); 927void 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
687void 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
701void FieldEditPanel::OnBitRangeEdited(const QString& input) 933void 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
719void FieldEditPanel::OnNameEdited(const QString& text) 946void 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
725void FieldEditPanel::OnDescEdited() 952soc_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
731void FieldEditPanel::OnValueActivated(int row, int column) 957/**
958 * RegEditPanel
959 */
960
961namespace
732{ 962{
733 if(column != 0) 963
734 return; 964enum
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
972RegEditPanel::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
753void FieldEditPanel::OnValueChanged(int row, int column) 1115void 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
778namespace 1131int 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
781enum 1142void 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
796class SocTreeItem : public QTreeWidgetItem 1151void RegEditPanel::OnDescEdited()
797{ 1152{
798public: 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; } 1157void RegEditPanel::OnVariantActivated(QTableWidgetItem *item)
803private: 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/** 1186void 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
811class NewDevTreeItem : public QTreeWidgetItem 1199void RegEditPanel::OnRegFieldActivated(const QModelIndex& index)
812{ 1200{
813public: 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; } 1207void RegEditPanel::OnFieldModified()
818private: 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/** 1215void RegEditPanel::DoModify()
823 * DevTreeItem 1216{
824 */ 1217 m_value_model->UpdateRegister(*m_ref.get());
1218 UpdateWidthRestrictions();
1219 OnModified();
1220}
825 1221
826class DevTreeItem : public QTreeWidgetItem 1222void RegEditPanel::OnRegFieldDelete()
827{ 1223{
828public: 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; } 1240void RegEditPanel::OnFieldRemove(int index)
833private: 1241{
834 SocDevRef m_ref; 1242 Q_UNUSED(index);
835}; 1243}
836 1244
837/** 1245int 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
841class NewRegTreeItem : public QTreeWidgetItem 1270void RegEditPanel::OnRegFieldNew()
842{ 1271{
843public: 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);
848private: 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
856class RegTreeItem : public QTreeWidgetItem 1290void RegEditPanel::OnFieldCreate()
857{ 1291{
858public: 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; }
863private:
864 SocRegRef m_ref;
865};
866 1294
867/** 1295void 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
871class NewFieldTreeItem : public QTreeWidgetItem 1306namespace
872{ 1307{
873public:
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; } 1309enum
878private: 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/** 1316enum
883 * FieldTreeItem 1317{
884 */ 1318 SocRefRole = Qt::UserRole,
1319};
885 1320
886class FieldTreeItem : public QTreeWidgetItem 1321template<typename T>
1322T SocTreeItemVal(QTreeWidgetItem *item)
887{ 1323{
888public: 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; } 1327template<typename T>
893private: 1328QTreeWidgetItem *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
962QWidget *RegEdit::GetWidget() 1422QWidget *RegEdit::GetWidget()
@@ -968,6 +1428,16 @@ RegEdit::~RegEdit()
968{ 1428{
969} 1429}
970 1430
1431int RegEdit::SetMessage(MessageWidget::MessageType type, const QString& msg)
1432{
1433 return m_msg->SetMessage(type, msg);
1434}
1435
1436void RegEdit::HideMessage(int id)
1437{
1438 m_msg->HideMessage(id);
1439}
1440
971void RegEdit::OnSave() 1441void 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
1052bool RegEdit::SaveSocFile(const QString& filename) 1525bool 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
1091void RegEdit::CreateNewFieldItem(QTreeWidgetItem *_parent) 1566void 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
1100void 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
1115void 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
1124void 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
1140void 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
1149void 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
1165void RegEdit::FillSocTree() 1587void 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
1176void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it) 1597void 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
1183void RegEdit::FixupEmptyItem(QTreeWidgetItem *item) 1604QIcon 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
1615bool 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
1625void 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
1214void RegEdit::SetModified(bool add, bool mod) 1664void 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
1220namespace 1670void RegEdit::OnSocItemNew()
1221{
1222
1223template< typename T >
1224void 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
1684void 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
1231void RegEdit::OnSocItemDelete() 1699void 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
1280void RegEdit::OnSocModified(bool modified) 1731void 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
1288void RegEdit::DisplaySoc(SocRef ref) 1738void 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
1293void RegEdit::DisplayDev(SocDevRef ref) 1743void 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
1298void RegEdit::DisplayReg(SocRegRef ref) 1748void 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
1303void RegEdit::DisplayField(SocFieldRef ref)
1304{
1305 SetPanel(new FieldEditPanel(ref, this));
1306}
1307
1308void RegEdit::UpdateName(QTreeWidgetItem *current) 1753void 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
1335void RegEdit::OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) 1774void 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
1362void RegEdit::OnSocItemActivated(QTreeWidgetItem *current, int column) 1811void 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
1375void 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
1388void 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
1401void 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
1413bool RegEdit::Quit() 1825bool 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
48public: 50public:
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
54class EmptyEditPanel : public QWidget, public AbstractRegEditPanel 56class EmptyEditPanel : public QWidget, public AbstractRegEditPanel
@@ -58,7 +60,7 @@ public:
58 EmptyEditPanel(QWidget *parent); 60 EmptyEditPanel(QWidget *parent);
59 61
60signals: 62signals:
61 void OnModified(bool mod); 63 void OnModified();
62 64
63protected: 65protected:
64}; 66};
@@ -67,178 +69,167 @@ class SocEditPanel : public QWidget, public AbstractRegEditPanel
67{ 69{
68 Q_OBJECT 70 Q_OBJECT
69public: 71public:
70 SocEditPanel(SocRef ref, QWidget *parent = 0); 72 SocEditPanel(const soc_desc::soc_ref_t& ref, QWidget *parent = 0);
71 73
72signals: 74signals:
73 void OnModified(bool mod); 75 void OnModified();
74 76
75protected slots: 77protected 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
79protected: 86protected:
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
87class DevEditPanel : public QWidget, public AbstractRegEditPanel 92class NodeInstanceEditPanel : public QWidget
88{ 93{
89 Q_OBJECT 94 Q_OBJECT
90public: 95public:
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
93signals: 101signals:
94 void OnModified(bool mod); 102 void OnModified();
95 103
96protected slots: 104protected 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
104protected: 119protected:
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
134class RegEditPanel : public QWidget, public AbstractRegEditPanel 134class NodeEditPanel : public QWidget, public AbstractRegEditPanel
135{ 135{
136 Q_OBJECT 136 Q_OBJECT
137public: 137public:
138 RegEditPanel(SocRegRef ref, QWidget *parent = 0); 138 NodeEditPanel(const soc_desc::node_ref_t& ref, QWidget *parent = 0);
139 139
140signals: 140signals:
141 void OnModified(bool mod); 141 void OnModified();
142 142
143protected slots: 143protected 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
151protected:
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
161class RegFieldEditPanel : public QWidget
162{
163 Q_OBJECT
164public:
165 RegFieldEditPanel(const soc_desc::field_ref_t& ref, QWidget *parent = 0);
166 soc_desc::field_ref_t GetField();
167 void UpdateWidth();
168
169signals:
170 void OnModified();
171
172protected 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
153protected: 179protected:
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
196class FieldEditPanel : public QWidget, public AbstractRegEditPanel 191class RegEditPanel : public QWidget, public AbstractRegEditPanel
197{ 192{
198 Q_OBJECT 193 Q_OBJECT
199public: 194public:
200 FieldEditPanel(SocFieldRef ref, QWidget *parent = 0); 195 RegEditPanel(const soc_desc::register_ref_t& ref, QWidget *parent = 0);
201 196
202signals: 197signals:
203 void OnModified(bool mod); 198 void OnModified();
204 199
205protected slots: 200protected 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
212protected: 213protected:
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
244class RegEdit : public QWidget, public DocumentTab 235class RegEdit : public QWidget, public DocumentTab
@@ -252,43 +243,50 @@ public:
252 243
253protected slots: 244protected 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
263protected: 256protected:
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
36enum 36enum
37{ 37{
38 RegTreeDevType = QTreeWidgetItem::UserType, 38 NodeInstRole = Qt::UserRole,
39 RegTreeRegType,
40 RegTreeSocType
41};
42
43class SocTreeItem : public QTreeWidgetItem
44{
45public:
46 SocTreeItem(const QString& string, const SocRef& ref)
47 :QTreeWidgetItem(QStringList(string), RegTreeSocType), m_ref(ref) {}
48
49 const SocRef& GetRef() { return m_ref; }
50private:
51 SocRef m_ref;
52};
53
54class DevTreeItem : public QTreeWidgetItem
55{
56public:
57 DevTreeItem(const QString& string, const SocDevRef& ref)
58 :QTreeWidgetItem(QStringList(string), RegTreeDevType), m_ref(ref) {}
59
60 const SocDevRef& GetRef() { return m_ref; }
61private:
62 SocDevRef m_ref;
63};
64
65class RegTreeItem : public QTreeWidgetItem
66{
67public:
68 RegTreeItem(const QString& string, const SocRegRef& ref)
69 :QTreeWidgetItem(QStringList(string), RegTreeRegType), m_ref(ref) {}
70
71 const SocRegRef& GetRef() { return m_ref; }
72private:
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
306void RegTab::OnAnalyserClicked(QListWidgetItem *current) 260void 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
314void RegTab::DisplayRegister(const SocRegRef& ref) 268void RegTab::DisplayNode(const soc_desc::node_inst_t& ref)
315{
316 SetPanel(new RegDisplayPanel(this, m_io_backend, ref));
317}
318
319void 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())
324void 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
329int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg) 278int 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
347void RegTab::OnSocListChanged() 296void 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
359void RegTab::FillDevSubTree(QTreeWidgetItem *_item) 304QTreeWidgetItem *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++) 311soc_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
375void RegTab::FillSocSubTree(QTreeWidgetItem *_item) 316void 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
392void RegTab::FillRegTree() 330void 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()
401void RegTab::FillAnalyserList() 339void 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
407void RegTab::OnSocChanged(int index) 346void 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
68protected: 68protected:
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:
102private slots: 101private 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
28AnalyserEx::AnalyserEx(const soc_desc::soc_ref_t& soc, IoBackend *backend)
29 :Analyser(soc, backend), m_helper(backend, soc)
30{
31}
32
33bool AnalyserEx::ReadRegister(const QString& path, soc_word_t& val)
34{
35 return m_helper.ReadRegister(m_helper.ParsePath(path), val);
36}
37
38bool AnalyserEx::ReadRegisterOld(const QString& dev, const QString& reg, soc_word_t& val)
39{
40 return ReadRegister(dev + "." + reg, val);
41}
42
43bool 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
48bool 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
27ClockAnalyser::ClockAnalyser(const SocRef& soc, IoBackend *backend) 58ClockAnalyser::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
78QTreeWidgetItem *ClockAnalyser::AddClock(QTreeWidgetItem *parent, const QString& name, int freq, int mul, int div) 109QTreeWidgetItem *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)
102void ClockAnalyser::FillTree() 134void 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
527void ClockAnalyser::FillTreeIMX233() 555void 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 */
745EmiAnalyser::EmiAnalyser(const SocRef& soc, IoBackend *backend) 772EmiAnalyser::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
1093PinAnalyser::PinAnalyser(const SocRef& soc, IoBackend *backend) 1119PinAnalyser::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
1130void PinAnalyser::FillList() 1156void 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
38class AnalyserEx : public Analyser
39{
40public:
41 AnalyserEx(const soc_desc::soc_ref_t& soc, IoBackend *backend);
42protected:
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
42class ClockAnalyser : public Analyser 56class ClockAnalyser : public AnalyserEx
43{ 57{
44public: 58public:
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 */
75class EmiAnalyser : public QObject, public Analyser 89class EmiAnalyser : public QObject, public AnalyserEx
76{ 90{
77 Q_OBJECT 91 Q_OBJECT
78public: 92public:
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 */
119class PinAnalyser : public Analyser 133class PinAnalyser : public AnalyserEx
120{ 134{
121public: 135public:
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 @@
36SocBitRangeValidator::SocBitRangeValidator(QObject *parent) 37SocBitRangeValidator::SocBitRangeValidator(QObject *parent)
37 :QValidator(parent) 38 :QValidator(parent)
38{ 39{
40 m_width = 32;
39} 41}
40 42
41void SocBitRangeValidator::fixup(QString& input) const 43void 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
93void SocBitRangeValidator::setWidth(int nr_bits)
94{
95 m_width = nr_bits;
96}
97
98QString 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
95SocFieldValidator::SocFieldValidator(QObject *parent) 110SocFieldValidator::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
102SocFieldValidator::SocFieldValidator(const soc_reg_field_t& field, QObject *parent) 117SocFieldValidator::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
326void SocFieldItemDelegate::setWidth(int bitcount)
327{
328 m_bitcount = bitcount;
329}
330
311/** 331/**
312 * SocFieldEditor 332 * SocFieldEditor
313 */ 333 */
314SocFieldEditor::SocFieldEditor(const soc_reg_field_t& field, QWidget *parent) 334SocFieldEditor::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
321SocFieldEditor::~SocFieldEditor() 344SocFieldEditor::~SocFieldEditor()
@@ -323,6 +346,11 @@ SocFieldEditor::~SocFieldEditor()
323 delete m_validator; 346 delete m_validator;
324} 347}
325 348
349void SocFieldEditor::editDone()
350{
351 emit editingFinished(field());
352}
353
326uint SocFieldEditor::field() const 354uint SocFieldEditor::field() const
327{ 355{
328 soc_word_t v; 356 soc_word_t v;
@@ -336,11 +364,11 @@ uint SocFieldEditor::field() const
336void SocFieldEditor::setField(uint field) 364void 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
343void SocFieldEditor::SetRegField(const soc_reg_field_t& field) 371void 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 */
355SocFieldCachedValue::SocFieldCachedValue(const soc_reg_field_t& field, uint value) 383SocFieldCachedValue::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
391bool SocFieldCachedValue::operator<(const SocFieldCachedValue& o) const
392{
393 return m_value < o.m_value;
394}
395
396/**
397 * SocFieldBitRange
398 */
399
400bool 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
373QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLocale& locale) const 419QString 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 */
412SocFieldCachedEditor::SocFieldCachedEditor(QWidget *parent) 457SocFieldCachedEditor::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
491void 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
479QVariant RegFieldTableModel::data(const QModelIndex& index, int role) const 529QVariant 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
612void RegFieldTableModel::SetRegister(const soc_reg_t& reg) 664void 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
677void 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
684soc_desc::register_t RegFieldTableModel::GetRegister() const
685{
686 return m_reg;
687}
688
625void RegFieldTableModel::SetValues(const QVector< QVariant >& values) 689void 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
681RegSexyDisplay2::RegSexyDisplay2(QWidget *parent) 745bool 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
770YRegDisplayItemDelegate::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
795QSize 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
807YRegDisplay::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
689QModelIndex RegSexyDisplay2::indexAt(const QPoint& point) const 820void 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
828int 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
843QModelIndex 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
695void RegSexyDisplay2::scrollTo(const QModelIndex& index, ScrollHint hint) 862void 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
701QRect RegSexyDisplay2::visualRect(const QModelIndex& index) const 868QRect 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
707bool RegSexyDisplay2::isIndexHidden(const QModelIndex& index) const 879bool 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
713QModelIndex RegSexyDisplay2::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) 885QModelIndex 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
720void RegSexyDisplay2::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) 892void 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
726int RegSexyDisplay2::verticalOffset() const 912int YRegDisplay::verticalOffset() const
727{ 913{
728 return verticalScrollBar()->value(); 914 return verticalScrollBar()->value();
729} 915}
730 916
731int RegSexyDisplay2::horizontalOffset() const 917int YRegDisplay::horizontalOffset() const
732{ 918{
733 return horizontalScrollBar()->value(); 919 return horizontalScrollBar()->value();
734} 920}
735 921
736void RegSexyDisplay2::scrollContentsBy(int dx, int dy) 922void YRegDisplay::scrollContentsBy(int dx, int dy)
737{ 923{
738 viewport()->scroll(dx, dy); 924 viewport()->scroll(dx, dy);
739} 925}
740 926
741void RegSexyDisplay2::setModel(QAbstractItemModel *model) 927void 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
747void RegSexyDisplay2::dataChanged(const QModelIndex &topLeft, 933void 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
754void RegSexyDisplay2::rowsInserted(const QModelIndex &parent, int start, int end) 940void 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
760void RegSexyDisplay2::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) 946void 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
766int RegSexyDisplay2::GetSeparatorSize() const 952int YRegDisplay::separatorSize() const
767{ 953{
768 return 1; 954 return 1;
769} 955}
770 956
771int RegSexyDisplay2::GetMarginSize() const 957int YRegDisplay::marginSize() const
772{ 958{
773 return viewOptions().fontMetrics.height() / 3; 959 return viewOptions().fontMetrics.height() / 3;
774} 960}
775 961
776int RegSexyDisplay2::GetHeaderTextSep() const 962int YRegDisplay::headerTextSep() const
777{ 963{
778 return GetMarginSize() / 2; 964 return marginSize() / 2;
779} 965}
780 966
781int RegSexyDisplay2::GetHeaderHeight() const 967int 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
786int RegSexyDisplay2::GetColumnWidth() const 972int YRegDisplay::minColumnWidth() const
787{ 973{
788 return 2 * GetMarginSize() + viewOptions().fontMetrics.height(); 974 return 2 * marginSize() + viewOptions().fontMetrics.height();
789} 975}
790 976
791int RegSexyDisplay2::GetMaxContentHeight() const 977int YRegDisplay::maxColumnWidth() const
978{
979 return 2 * minColumnWidth();
980}
981
982int 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
993int 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
1004int 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
807int RegSexyDisplay2::GetGapHeight() const 1020int YRegDisplay::gapHeight() const
808{ 1021{
809 return GetMarginSize() / 2; 1022 return marginSize() / 2;
810} 1023}
811 1024
812QRegion RegSexyDisplay2::visualRegionForSelection(const QItemSelection& selection) const 1025int 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
818void RegSexyDisplay2::paintEvent(QPaintEvent *event) 1030QRegion 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
1047QRect 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
1058QRect 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
1078void 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
898void RegSexyDisplay2::RecomputeGeometry() 1164void 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
912void RegSexyDisplay2::resizeEvent(QResizeEvent*) 1178void 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
919void RegSexyDisplay2::updateGeometries() 1185void 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
1195bool 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
1007void MyTextEditor::SetReadOnly(bool en) 1311void 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
1045void MyTextEditor::OnTextBold(bool checked) 1350void 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
1402bool 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 */
1578YTabWidget::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
1599void YTabWidget::setTabOpenable(bool openable)
1600{
1601 m_tab_openable = openable;
1602 m_tab_open_button->setVisible(openable);
1603}
1604
1605void YTabWidget::OnOpenButton(bool checked)
1606{
1607 Q_UNUSED(checked);
1608 emit tabOpenRequested();
1609}
1610
1611void YTabWidget::setTabOpenMenu(QMenu *menu)
1612{
1613 m_tab_open_button->setMenu(menu);
1614}
1615
1616/**
1255 * MessageWidget 1617 * MessageWidget
1256 */ 1618 */
1257MessageWidget::MessageWidget(QWidget *parent) 1619MessageWidget::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
1709QGroupBox *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
1716QGroupBox *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
47namespace
48{
49template< typename T >
50inline bool isUserType(const QVariant& var)
51{
52 return var.type() == QVariant::UserType && var.userType() == qMetaTypeId< T >();
53}
54
55}
56
44class SocBitRangeValidator : public QValidator 57class 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
72protected:
73 int m_width;
54}; 74};
55 75
56class SocFieldValidator : public QValidator 76class SocFieldValidator : public QValidator
@@ -58,7 +78,7 @@ class SocFieldValidator : public QValidator
58 Q_OBJECT 78 Q_OBJECT
59public: 79public:
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
68protected: 88protected:
69 soc_reg_field_t m_field; 89 soc_desc::field_t m_field;
70}; 90};
71 91
72class RegLineEdit : public QWidget 92class RegLineEdit : public QWidget
@@ -112,10 +132,11 @@ class SocFieldItemDelegate : public QStyledItemDelegate
112{ 132{
113public: 133public:
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);
119protected: 140protected:
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)
127public: 148public:
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
156signals:
157 void editingFinished(uint value);
158
159protected slots:
160 void editDone();
134 161
135protected: 162protected:
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
141class SocFieldEditorCreator : public QItemEditorCreatorBase 168class SocFieldEditorCreator : public QItemEditorCreatorBase
142{ 169{
143public: 170public:
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
150protected: 179protected:
151 soc_reg_field_t m_field; 180 soc_desc::field_t m_field;
152}; 181};
153 182
154class SocFieldCachedValue 183class SocFieldCachedValue
155{ 184{
156public: 185public:
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;
164protected: 195protected:
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)
172class SocFieldBitRange 203class SocFieldBitRange
173{ 204{
174public: 205public:
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;
180protected: 214protected:
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
249public: 283public:
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
296class RegSexyDisplay2 : public QAbstractItemView 332class RegFieldProxyModel : public QSortFilterProxyModel
333{
334public:
335 RegFieldProxyModel(QObject *parent):QSortFilterProxyModel(parent) {}
336protected:
337 bool lessThan(const QModelIndex& left, const QModelIndex& right) const;
338};
339
340class YRegDisplayItemDelegate : public QStyledItemDelegate
341{
342public:
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
350class YRegDisplay : public QAbstractItemView
297{ 351{
298 Q_OBJECT 352 Q_OBJECT
299public: 353public:
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
306protected slots: 364protected 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
313protected: 371protected:
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
390signals: 459signals:
391 void OnTextChanged(); 460 void OnTextChanged();
461 void OnTextChanged(const QString& text_html);
392 462
393protected slots: 463protected 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
400protected: 470protected:
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
558Q_DECLARE_METATYPE(QModelIndex)
559
560class YTabWidget : public QTabWidget
561{
562 Q_OBJECT
563 Q_PROPERTY(bool tabOpenable READ tabOpenable WRITE setTabOpenable)
564public:
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
571signals:
572 void tabOpenRequested();
573
574protected slots:
575 void OnOpenButton(bool checked);
576
577protected:
578 bool m_tab_openable;
579 QToolButton *m_tab_open_button;
580};
581
582class Misc
583{
584public:
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 */