[gem5-dev] Change in gem5/gem5[master]: mem: Add a helper function to get a word of variable length

2018-04-17 Thread Andreas Sandberg (Gerrit)
Andreas Sandberg has submitted this change and it was merged. (  
https://gem5-review.googlesource.com/9761 )


Change subject: mem: Add a helper function to get a word of variable length
..

mem: Add a helper function to get a word of variable length

There are many devices that need to handle reads/writes of different
word sizes. A common pattern is a switch statement that check for the
size of a packet and then calls the corresponding
Packet::(get|set) methods. Simplify this by implementing
Packet::(get|set)UintX helper functions.

The getter reads a word of the size specified in the packet and the
specified endianness. The word is then zero-extended to 64
bits. Conversely, the setter truncates the word down to the size
required in the packet and then byte-swaps it to the desired
endianness.

Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f
Signed-off-by: Andreas Sandberg 
Reviewed-by: Nikos Nikoleris 
Reviewed-on: https://gem5-review.googlesource.com/9761
Maintainer: Nikos Nikoleris 
---
M src/mem/packet.cc
M src/mem/packet.hh
2 files changed, 56 insertions(+), 2 deletions(-)

Approvals:
  Nikos Nikoleris: Looks good to me, approved; Looks good to me, approved



diff --git a/src/mem/packet.cc b/src/mem/packet.cc
index ffda3d5..7a81cdb 100644
--- a/src/mem/packet.cc
+++ b/src/mem/packet.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2017 ARM Limited
+ * Copyright (c) 2011-2018 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -56,6 +56,7 @@
 #include "base/cprintf.hh"
 #include "base/logging.hh"
 #include "base/trace.hh"
+#include "mem/packet_access.hh"

 using namespace std;

@@ -364,6 +365,45 @@
 return sender_state;
 }

+uint64_t
+Packet::getUintX(ByteOrder endian) const
+{
+switch(getSize()) {
+  case 1:
+return (uint64_t)get(endian);
+  case 2:
+return (uint64_t)get(endian);
+  case 4:
+return (uint64_t)get(endian);
+  case 8:
+return (uint64_t)get(endian);
+  default:
+panic("%i isn't a supported word size.\n", getSize());
+}
+}
+
+void
+Packet::setUintX(uint64_t w, ByteOrder endian)
+{
+switch(getSize()) {
+  case 1:
+set((uint8_t)w, endian);
+break;
+  case 2:
+set((uint16_t)w, endian);
+break;
+  case 4:
+set((uint32_t)w, endian);
+break;
+  case 8:
+set((uint64_t)w, endian);
+break;
+  default:
+panic("%i isn't a supported word size.\n", getSize());
+}
+
+}
+
 void
 Packet::print(ostream , const int verbosity, const string ) const
 {
diff --git a/src/mem/packet.hh b/src/mem/packet.hh
index b5b882c..a4eeabe 100644
--- a/src/mem/packet.hh
+++ b/src/mem/packet.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2017 ARM Limited
+ * Copyright (c) 2012-2018 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -1068,6 +1068,20 @@
 template 
 void set(T v);

+
+/**
+ * Get the data in the packet byte swapped from the specified
+ * endianness and zero-extended to 64 bits.
+ */
+uint64_t getUintX(ByteOrder endian) const;
+
+/**
+ * Set the value in the word w after truncating it to the length
+ * of the packet and then byteswapping it to the desired
+ * endianness.
+ */
+void setUintX(uint64_t w, ByteOrder endian);
+
 /**
  * Copy data into the packet from the provided pointer.
  */

--
To view, visit https://gem5-review.googlesource.com/9761
To unsubscribe, or for help writing mail filters, visit  
https://gem5-review.googlesource.com/settings


Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f
Gerrit-Change-Number: 9761
Gerrit-PatchSet: 2
Gerrit-Owner: Andreas Sandberg 
Gerrit-Reviewer: Andreas Sandberg 
Gerrit-Reviewer: Nikos Nikoleris 
Gerrit-MessageType: merged
___
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

[gem5-dev] Change in gem5/gem5[master]: mem: Add a helper function to get a word of variable length

2018-04-11 Thread Andreas Sandberg (Gerrit)

Hello Nikos Nikoleris,

I'd like you to do a code review. Please visit

https://gem5-review.googlesource.com/9761

to review the following change.


Change subject: mem: Add a helper function to get a word of variable length
..

mem: Add a helper function to get a word of variable length

There are many devices that need to handle reads/writes of different
word sizes. A common pattern is a switch statement that check for the
size of a packet and then calls the corresponding
Packet::(get|set) methods. Simplify this by implementing
Packet::(get|set)UintX helper functions.

The getter reads a word of the size specified in the packet and the
specified endianness. The word is then zero-extended to 64
bits. Conversely, the setter truncates the word down to the size
required in the packet and then byte-swaps it to the desired
endianness.

Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f
Signed-off-by: Andreas Sandberg 
Reviewed-by: Nikos Nikoleris 
---
M src/mem/packet.cc
M src/mem/packet.hh
2 files changed, 56 insertions(+), 2 deletions(-)



diff --git a/src/mem/packet.cc b/src/mem/packet.cc
index ffda3d5..7a81cdb 100644
--- a/src/mem/packet.cc
+++ b/src/mem/packet.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2017 ARM Limited
+ * Copyright (c) 2011-2018 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -56,6 +56,7 @@
 #include "base/cprintf.hh"
 #include "base/logging.hh"
 #include "base/trace.hh"
+#include "mem/packet_access.hh"

 using namespace std;

@@ -364,6 +365,45 @@
 return sender_state;
 }

+uint64_t
+Packet::getUintX(ByteOrder endian) const
+{
+switch(getSize()) {
+  case 1:
+return (uint64_t)get(endian);
+  case 2:
+return (uint64_t)get(endian);
+  case 4:
+return (uint64_t)get(endian);
+  case 8:
+return (uint64_t)get(endian);
+  default:
+panic("%i isn't a supported word size.\n", getSize());
+}
+}
+
+void
+Packet::setUintX(uint64_t w, ByteOrder endian)
+{
+switch(getSize()) {
+  case 1:
+set((uint8_t)w, endian);
+break;
+  case 2:
+set((uint16_t)w, endian);
+break;
+  case 4:
+set((uint32_t)w, endian);
+break;
+  case 8:
+set((uint64_t)w, endian);
+break;
+  default:
+panic("%i isn't a supported word size.\n", getSize());
+}
+
+}
+
 void
 Packet::print(ostream , const int verbosity, const string ) const
 {
diff --git a/src/mem/packet.hh b/src/mem/packet.hh
index b5b882c..a4eeabe 100644
--- a/src/mem/packet.hh
+++ b/src/mem/packet.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2017 ARM Limited
+ * Copyright (c) 2012-2018 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -1068,6 +1068,20 @@
 template 
 void set(T v);

+
+/**
+ * Get the data in the packet byte swapped from the specified
+ * endianness and zero-extended to 64 bits.
+ */
+uint64_t getUintX(ByteOrder endian) const;
+
+/**
+ * Set the value in the word w after truncating it to the length
+ * of the packet and then byteswapping it to the desired
+ * endianness.
+ */
+void setUintX(uint64_t w, ByteOrder endian);
+
 /**
  * Copy data into the packet from the provided pointer.
  */

--
To view, visit https://gem5-review.googlesource.com/9761
To unsubscribe, or for help writing mail filters, visit  
https://gem5-review.googlesource.com/settings


Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f
Gerrit-Change-Number: 9761
Gerrit-PatchSet: 1
Gerrit-Owner: Andreas Sandberg 
Gerrit-Reviewer: Nikos Nikoleris 
Gerrit-MessageType: newchange
___
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev